如何从 Keras.layers 实现合并
How to implement Merge from Keras.layers
我一直在尝试合并以下顺序模型,但未能成功。谁能指出我的错误,谢谢
代码编译时使用"merge"但给出以下错误"TypeError: 'module' object is not callable"
但是,它甚至在使用 "Merge"
时都无法编译
我正在使用 keras 版本 2.2.0 和 python 3.6
from keras.layers import merge
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.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
合并不能与顺序模型一起使用。在顺序模型中,层只能有一个输入和一个输出。
你必须使用 functional API,像这样。我假设您对 modela 和 modelb 使用相同的输入层,但如果不是这样,您可以创建另一个 Input() 并将它们都作为模型的输入。
def linear_model_combined(optimizer='Adadelta'):
# declare input
inlayer =Input(shape=(100, 34))
flatten = Flatten()(inlayer)
modela = Dense(1024)(flatten)
modela = Activation('relu')(modela)
modela = Dense(512)(modela)
modelb = Dense(1024)(flatten)
modelb = Activation('relu')(modelb)
modelb = Dense(512)(modelb)
model_concat = concatenate([modela, modelb])
model_concat = Activation('relu')(model_concat)
model_concat = Dense(256)(model_concat)
model_concat = Activation('relu')(model_concat)
model_concat = Dense(4)(model_concat)
model_concat = Activation('softmax')(model_concat)
model_combined = Model(inputs=inlayer,outputs=model_concat)
model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model_combined
keras.layers.merge 图层已弃用。如此处所述,使用 keras.layers.Concatenate(axis=-1)
代替:https://keras.io/layers/merge/#concatenate
老实说,我在这个问题上纠结了很久...
幸好我终于找到了万灵丹。对于想要使用 Sequential 对其原始代码进行最小更改的任何人,这里提供了解决方案:
def linear_model_combined(optimizer='Adadelta'):
from keras.models import Model, Sequential
from keras.layers.core import Dense, Flatten, Activation, Dropout
from keras.layers import add
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))
merged_output = add([modela.output, modelb.output])
model_combined = Sequential()
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'))
final_model = Model([modela.input, modelb.input], model_combined(merged_output))
final_model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return final_model
更多信息,请参考https://github.com/keras-team/keras/issues/3921#issuecomment-335457553farizrahman4u
的评论。 ;)
我一直在尝试合并以下顺序模型,但未能成功。谁能指出我的错误,谢谢
代码编译时使用"merge"但给出以下错误"TypeError: 'module' object is not callable" 但是,它甚至在使用 "Merge"
时都无法编译我正在使用 keras 版本 2.2.0 和 python 3.6
from keras.layers import merge
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.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
合并不能与顺序模型一起使用。在顺序模型中,层只能有一个输入和一个输出。 你必须使用 functional API,像这样。我假设您对 modela 和 modelb 使用相同的输入层,但如果不是这样,您可以创建另一个 Input() 并将它们都作为模型的输入。
def linear_model_combined(optimizer='Adadelta'):
# declare input
inlayer =Input(shape=(100, 34))
flatten = Flatten()(inlayer)
modela = Dense(1024)(flatten)
modela = Activation('relu')(modela)
modela = Dense(512)(modela)
modelb = Dense(1024)(flatten)
modelb = Activation('relu')(modelb)
modelb = Dense(512)(modelb)
model_concat = concatenate([modela, modelb])
model_concat = Activation('relu')(model_concat)
model_concat = Dense(256)(model_concat)
model_concat = Activation('relu')(model_concat)
model_concat = Dense(4)(model_concat)
model_concat = Activation('softmax')(model_concat)
model_combined = Model(inputs=inlayer,outputs=model_concat)
model_combined.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return model_combined
keras.layers.merge 图层已弃用。如此处所述,使用 keras.layers.Concatenate(axis=-1)
代替:https://keras.io/layers/merge/#concatenate
老实说,我在这个问题上纠结了很久...
幸好我终于找到了万灵丹。对于想要使用 Sequential 对其原始代码进行最小更改的任何人,这里提供了解决方案:
def linear_model_combined(optimizer='Adadelta'):
from keras.models import Model, Sequential
from keras.layers.core import Dense, Flatten, Activation, Dropout
from keras.layers import add
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))
merged_output = add([modela.output, modelb.output])
model_combined = Sequential()
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'))
final_model = Model([modela.input, modelb.input], model_combined(merged_output))
final_model.compile(loss='categorical_crossentropy', optimizer=optimizer, metrics=['accuracy'])
return final_model
更多信息,请参考https://github.com/keras-team/keras/issues/3921#issuecomment-335457553farizrahman4u
的评论。 ;)