我正在使用concatenate来更新之前使用merge的代码。然而,我不知道如何在Keras对象模型中将Flatten()添加到input_shape中。
之前的版本
def linear_model_combined(optimizer='Adadelta'): modela = Sequential() modela.add(Flatten(input_shape=(100, 34))) modela.add(Dense(1024)) modela.add(Activation('relu')) modela.add(Dense(512)) modelb = Sequential() modelb.add(Flatten(input_shape=(100, 34))) modelb.add(Dense(1024)) modelb.add(Activation('relu')) modelb.add(Dense(512)) model_combined = Sequential() model_combined.add(merge([modela, modelb], mode='concat')) model_combined = concatenate([modela,modelb]) model_combined.add(Activation('relu')) model_combined.add(Dense(256)) model_combined.add(Activation('relu')) model_combined.add(Dense(4)) model_combined.add(Activation('softmax')) model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy']) return model_combined
我正在尝试使其工作:
def linear_model_combined(optimizer='Adadelta'): modela_in = Input(shape=(100,34)) modela_out1 = Dense(1024,activation='relu',name='layer_a1')(modela_in) modela_out2 = Dense(512,activation='relu',name='layer_a2')(modela_out1) modela = Model(modela_in,modela_out2) modelb_in = Input(shape=(100,34)) modelb_out1 = Dense(1024,activation='relu',name='layer_b1')(modelb_in) modelb_out2 = Dense(512,activation='relu',name='layer_b2')(modelb_out1) modelb = Model(modelb_in,modelb_out2) modelconcat_in = concatenate([modela_out2,modelb_out2]) modelconcat_out1 = Dense(256,activation='relu',name='layer_c1')(modelconcat_in) modelconcat_out = Dense(4,activation='softmax',name='layer_c2')(modelconcat_out1) model_merged = Model([modela_in,modelb_in], modelconcat_out) model_merged.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['accuracy']) return model_merged
模型训练:
model = linear_model_combined()hist = model.fit([x_train_speech, x_train_speech2], Y, batch_size=100, epochs =80, verbose=1, shuffle = True, validation_split=0.2)
我不知道如何精确匹配形状。我得到了以下错误:
ValueError: Shapes (None, 4) and (None, 100, 4) are incompatible
回答:
所以,当我按照评论中建议的尝试添加Flatten()时,它工作了。我意识到我试图在对象模型中以顺序模型的方式使用Flatten()。因此,必须在将对象模型传递到代码中之前使用Flatten(),这样它就能工作!
谢谢!
def linear_model_combined(optimizer='Adadelta'): modela_in = Input(shape=(100,34)) modela_inf = Flatten()(modela_in) modela_out1 = Dense(1024,activation='relu',name='layer_a1')(modela_inf) modela_out2 = Dense(512,activation='relu',name='layer_a2')(modela_out1) modela = Model(modela_in,modela_out2) modelb_in = Input(shape=(100,34)) modelb_inf = Flatten()(modelb_in) modelb_out1 = Dense(1024,activation='relu',name='layer_b1')(modelb_inf) modelb_out2 = Dense(512,activation='relu',name='layer_b2')(modelb_out1) modelb = Model(modelb_in,modelb_out2) modelconcat_in = concatenate([modela_out2,modelb_out2]) modelconcat_out1 = Dense(256,activation='relu',name='layer_c1')(modelconcat_in) modelconcat_out = Dense(4,activation='softmax',name='layer_c2')(modelconcat_out1) model_merged = Model([modela_in,modelb_in], modelconcat_out) model_merged.compile(loss='categorical_crossentropy',optimizer=optimizer, metrics=['accuracy']) return model_merged