Я пытаюсь дублировать cnn и объединить их, чтобы получить архитектуру с двумя путями. Но получаю ошибку. Я использую версию Keras 2.1.6 - PullRequest
0 голосов
/ 22 апреля 2020

Нужна помощь с кодированием python. Я попытался объединить 2 модели CNN. Модель № 1 имеет 3 слоя свертки, за которыми следует плотный слой. Model2 также имеет ту же архитектуру. Я пытаюсь объединить вывод этих cnns и иметь другой плотный слой. Я включил код для вашей ссылки.


model1 = Sequential()
# Conv Layer 1
model1.add(layers.SeparableConv2D(32, (9, 9), activation='relu', input_shape=input_shape))
model1.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# Conv Layer 2
model1.add(layers.SeparableConv2D(64, (9, 9), activation='relu'))
model1.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# Conv Layer 3
model1.add(layers.SeparableConv2D(128, (9, 9), activation='relu'))
model1.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# model.add(layers.SeparableConv2D(256, (9, 9), activation='relu'))
# model.add(layers.MaxPooling2D(2, 2))
# Flatten the data for upcoming dense layer
model1.add(layers.Flatten())

model1.add(layers.Dropout(0.5))
model1.add(layers.Dense(512, activation='relu'))
#model1.add(layers.Dense(output_classes,) activation='relu'))
#model1.build(input_shape = (input_shape)


model2 = Sequential()
# Conv Layer 1
model2.add(layers.SeparableConv2D(32, (9, 9), activation='relu', input_shape=input_shape))
model2.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# Conv Layer 2
model2.add(layers.SeparableConv2D(64, (9, 9), activation='relu'))
model2.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# Conv Layer 3
model2.add(layers.SeparableConv2D(128, (9, 9), activation='relu'))
model2.add(layers.MaxPooling2D(2, 2))
# model.add(layers.Dropout(0.25))

# model.add(layers.SeparableConv2D(256, (9, 9), activation='relu'))
# model.add(layers.MaxPooling2D(2, 2))
# Flatten the data for upcoming dense layer
model2.add(layers.Flatten())

model2.add(layers.Dropout(0.5))
model2.add(layers.Dense(512, activation='relu'))
#model2.add(layers.Dense(output_classes, activation='relu'))

comb_model = Sequential()

x1=model1.output
x2=model2.output
comb_model.layers.Concatenate([x1,x2],axis=-1)
comb_model.add(layers.Dense(512, activation='relu'))
comb_model.add(layers.Dropout(0.6))
comb_model.add(layers.Dense(output_classes, activation=tf.nn.softmax))

print(comb_model.summary())

отображается ошибка


---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-28-267f93f5102f> in <module>()
      3 x1=model1.output
      4 x2=model2.output
----> 5 comb_model.layers.Concatenate([x1,x2],axis=-1)
      6 comb_model.add(layers.Dense(512, activation='relu'))
      7 comb_model.add(layers.Dropout(0.6))

AttributeError: 'list' object has no attribute 'Concatenate'

1 Ответ

0 голосов
/ 23 апреля 2020

Можете ли вы вместо этого создать свою комбинированную модель?

x1=model1.output
x2=model2.output
concat = layers.Concatenate()([x1,x2])
dense1 = layers.Dense(512, activation='relu')(concat)
dropout = layers.Dropout(0.6)(dens1)
dense2 = layers.Dense(output_classes, activation=tf.nn.softmax)(dropout)
comb_model = tf.keras.Model(inputs=[model1.input, model2.input], outputs=dense2)

Надеюсь, это сработает.

...