Keras.layers.concatenate генерирует ошибку ' - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь обучить CNN с двумя входными ветвями.И эти две ветви (b1, b2) должны быть объединены в плотно связанный слой из 256 нейронов с частотой выпадения 0,25.Это то, что у меня есть до сих пор:

batch_size, epochs = 32, 3
ksize = 2
l2_lambda = 0.0001


### My first model(b1)
b1 = Sequential()
b1.add(Conv1D(128*2, kernel_size=ksize,
             activation='relu',
             input_shape=( xtest.shape[1], xtest.shape[2]),
             kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(MaxPooling1D(pool_size=ksize))
b1.add(Dropout(0.2))

b1.add(Conv1D(128*2, kernel_size=ksize, activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b1.add(MaxPooling1D(pool_size=ksize))
b1.add(Dropout(0.2))

b1.add(Flatten())

###My second model (b2)

b2 = Sequential()
b2.add(Dense(64, input_shape = (5000,), activation='relu',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
b2.add(Dropout(0.1))


##Merging the two models
model = Sequential()
model.add(concatenate([b1, b2],axis = -1))
model.add(Dense(256, activation='relu', kernel_initializer='normal',kernel_regularizer=keras.regularizers.l2(l2_lambda)))
model.add(Dropout(0.25))
model.add(Dense(num_classes, activation='softmax'))

Но когда я объединяю, это дает мне следующую ошибку:

enter image description here

Сначала я попытался использовать следующую команду:

  model.add(Merge([b1, b2], mode = 'concat'))

Но я получил ошибку, что 'ImportError: невозможно импортировать имя' Merge '' .Я использую keras 2.2.2 и python 3.6.

1 Ответ

0 голосов
/ 14 сентября 2018

Вам нужно использовать функциональный API для достижения того, что вы ищете. Вы можете использовать слой Concatenate или его эквивалентный функциональный API concatenate:

concat = Concatenate(axis=-1)([b1.output, b2.output])
# or you can use the functional api as follows:
#concat = concatenate([b1.output, b2.output], axis=-1)

x = Dense(256, activation='relu', kernel_initializer='normal',
          kernel_regularizer=keras.regularizers.l2(l2_lambda))(concat)
x = Dropout(0.25)(x)
output = Dense(num_classes, activation='softmax')(x)

model = Model([b1.input, b2.input], [output])

Обратите внимание, что я преобразовал только последнюю часть вашей модели в функциональную форму. Вы можете сделать то же самое для двух других моделей b1 и b2 (на самом деле, кажется, что архитектура, которую вы пытаетесь определить, представляет собой единую модель, которая состоит из двух ветвей, которые объединены вместе). В конце используйте model.summary(), чтобы увидеть и перепроверить архитектуру модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...