Обучение объединенному слою в керасе

Я реализую эту статью Мохаммада Хавейя. Он использует следующую архитектуру:

введите описание изображения здесь

Я изменил код здесь, чтобы сделать это.

print 'Compiling two-path model...' #local pathway modle_l=Sequential() modle_l.add(Convolution2D(64,7,7, border_mode='valid',W_regularizer=l1l2(l1=0.01, l2=0.01), input_shape=(4,33,33))) modle_l.add(Activation('relu')) modle_l.add(BatchNormalization(mode=0,axis=1)) modle_l.add(MaxPooling2D(pool_size=(2,2),strides=(1,1))) modle_l.add(Dropout(0.5)) #Add second convolution modle_l.add(Convolution2D(64,3,3, border_mode='valid',W_regularizer=l1l2(l1=0.01, l2=0.01), input_shape=(4,33,33))) modle_l.add(BatchNormalization(mode=0,axis=1)) modle_l.add(MaxPooling2D(pool_size=(4,4), strides=(1,1))) modle_l.add(Dropout(0.5)) #global pathway modelg = Sequential() modelg.add(Convolution2D(160,12,12, border_mode='valid', W_regularizer=l1l2(l1=0.01, l2=0.01), input_shape=(self.n_chan,33,33))) modelg.add(Activation('relu')) modelg.add(BatchNormalization(mode=0, axis=1)) modelg.add(MaxPooling2D(pool_size=(2,2), strides=(1,1))) modelg.add(Dropout(0.5)) # merge local and global pathways merge= Sequential() merge.add(Merge([modle_l,modelg], mode='concat',concat_axis=1)) merge.add(Convolution2D(5,21,21, border_mode='valid', W_regularizer=l1l2(l1=0.01, l2=0.01), input_shape=(4,33,33))) # Flatten output of 5x1x1 to 1x5, perform softmax merge.add(Flatten()) merge.add(Dense(5)) merge.add(Activation('softmax')) sgd = SGD(lr=0.001, decay=0.01, momentum=0.9) merge.compile(loss='categorical_crossentropy', optimizer='sgd') print 'Done' return merge 

Я использовал этот альтернативный подход, поскольку модель графа устарела в keras 1.0. Мой вопрос: как мне сейчас обучать модель? Я использовал это для обучения

 merge.fit(X_train, Y_train, batch_size=self.batch_size, nb_epoch=self.n_epoch, validation_split=0.1, show_accuracy=True, verbose=1) 

В случае, если мне нужно отдельно подготовить два слоя, а затем объединить, как мне это сделать?

One Solution collect form web for “Обучение объединенному слою в керасе”

 from keras.layers import * from keras.models import Model print 'Compiling two-path model...' # Input of the model input_model = Input(shape=(4,33,33)) # Local pathway #Add first convolution model_l = Convolution2D(64,7,7, border_mode='valid', activation='relu', W_regularizer=l1l2(l1=0.01, l2=0.01))(input_model) model_l = BatchNormalization(mode=0,axis=1)(model_l) model_l = MaxPooling2D(pool_size=(2,2),strides=(1,1))(model_l) model_l = Dropout(0.5)(model_l) #Add second convolution model_l = Convolution2D(64,3,3, border_mode='valid', W_regularizer=l1l2(l1=0.01, l2=0.01), input_shape=(4,33,33))(model_l) model_l = BatchNormalization(mode=0,axis=1)(model_l) model_l = MaxPooling2D(pool_size=(4,4),strides=(1,1))(model_l) model_l = Dropout(0.5)(model_l) #global pathway model_g = Convolution2D(160,12,12, border_mode='valid', activation='relu', W_regularizer=l1l2(l1=0.01, l2=0.01))(input_model) model_g = BatchNormalization(mode=0,axis=1)(model_g) model_g = MaxPooling2D(pool_size=(2,2), strides=(1,1))(model_g) model_g = Dropout(0.5)(model_g) # merge local and global pathways merge = Merge(mode='concat', concat_axis=1)([model_l,model_g]) merge = Convolution2D(5,21,21, border_mode='valid', W_regularizer=l1l2(l1=0.01, l2=0.01))(merge) merge = Flatten()(merge) predictions = Dense(5, activation='softmax')(merge) model_merged = Model(input=input_model,output=predictions) sgd = SGD(lr=0.001, decay=0.01, momentum=0.9) model_merged.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy']) print('Done') return model_merged 

это эквивалент сети, которую вы опубликовали, но определяемой с помощью функционального API

Как вы можете видеть, есть только 1 слой ввода, который используется дважды. Затем вы можете обучить его, как вы сказали:

 model_merged.fit(X_train, Y_train, batch_size=self.batch_size, nb_epoch=self.n_epoch, validation_split=0.1, verbose=1) 

это помогает?

Python - лучший язык программирования в мире.