пытаясь добавить входной слой к модели CNN в керасе - PullRequest
0 голосов
/ 03 мая 2020

Я пытался добавить вход в параллельный путь cnn, чтобы создать остаточную архитектуру, но я получаю несоответствие размеров.


from keras import layers, Model
input_shape = (128,128,3) # Change this accordingly
my_input = layers.Input(shape=input_shape) # one input
def parallel_layers(my_input, parallel_id=1):
  x = layers.SeparableConv2D(32, (9, 9), activation='relu', name='conv_1_'+str(parallel_id))(my_input)
  x = layers.MaxPooling2D(2, 2)(x)
  x = layers.SeparableConv2D(64, (9, 9), activation='relu', name='conv_2_'+str(parallel_id))(x)
  x = layers.MaxPooling2D(2, 2)(x)
  x = layers.SeparableConv2D(128, (9, 9), activation='relu', name='conv_3_'+str(parallel_id))(x)
  x = layers.MaxPooling2D(2, 2)(x)
  x = layers.Flatten()(x)
  x = layers.Dropout(0.5)(x)
  x = layers.Dense(512, activation='relu')(x)

  return x

parallel1 = parallel_layers(my_input, 1)
parallel2 = parallel_layers(my_input, 2)

concat = layers.Concatenate()([parallel1, parallel2])
concat=layers.Add()(concat,my_input)
x = layers.Dense(128, activation='relu')(concat)
x = Dense(7, activation='softmax')(x)

final_model = Model(inputs=my_input, outputs=x)

final_model.fit_generator(train_generator, steps_per_epoch = 
    nb_train_samples // batch_size, epochs = epochs, validation_data = validation_generator,
    validation_steps = nb_validation_samples // batch_size) 

Я получаю ошибку

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-48-163442df0d4c> in <module>()
      1 concat = layers.Concatenate()([parallel1, parallel2])
----> 2 concat=layers.Add()(concat,my_input)
      3 x = layers.Dense(128, activation='relu')(parallel2)
      4 x = Dense(7, activation='softmax')(x)
      5 

TypeError: __call__() takes 2 positional arguments but 3 were given

Я использую версию keras 2.1.6. Пожалуйста, помогите решить эту final_model.summary ()

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Вы должны удалить следующую строку:

concat=layers.Add()(concat,my_input)

Это не имеет никакого смысла. У вас есть метод, который принимает входные данные, разветвляется на две параллельные модели. Выходы обоих (parallel1 и parallel2) являются векторами длины 512. Затем вы можете либо Concatenate их иметь длину 1024, либо Add их снова иметь длину 512. Затем concat проходит дальше Dense слоев.

Короче, удалите следующую строку:

concat=layers.Add()(concat,my_input)

Если вы хотите объединить и иметь вектор длиной 1024, оставьте оставшуюся часть кода, как есть, в противном случае, если Вы хотите добавить их и иметь вектор длиной 512, замените следующую строку:

concat = layers.Concatenate()([parallel1, parallel2])

на эту:

concat = layers.Add()([parallel1, parallel2])
0 голосов
/ 03 мая 2020

определите свой слой добавления следующим образом

concat=layers.Add()([concat,my_input])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...