我在keras中有两个经过训练的模型,我想将一个模型堆叠在另一个上面以形成一个单一的模型。我想这样做是为了将训练有素的模型合二为一。
我认为merge(Merge)用于水平堆叠模型,而我想垂直堆栈keras功能API模型。
PS:输出1的形状与输入2
相同答案 0 :(得分:5)
inputA = Input(input_shape_for_A)
outputA = modelA(inputA)
outputB = modelB(outputA)
modelC = Model(inputA, outputB)
答案 1 :(得分:1)
与接受的答案类似,此方法无需重新定义输入层即可工作。
modelC=Model(
inputs=modelA.inputs,
outputs=modelB(modelA(modelA.inputs))
)
在我的用例中,我有一个带有多个输出的预处理器,而主模型有多个输入。模型 A 的输出层与模型 B 的输入层具有相同的名称,但它们的定义顺序可能不同。此函数对模型 A 的输出进行适当的重新排序并将它们传递给模型 B。
def stack_models(model1, model2):
#get model output and input names
model1_out_names=model1.output_names
model2_in_names=model2.input_names
#generate a sorted index that maps the order of model1 outputs to model2 inputs
name_idx=[model1_out_names.index(name) for name in model2_in_names]
model1_output=model1(model1.inputs)
model2_input=[model1_output[idx] for idx in name_idx]
model2_output=model2(model2_input)
return tf.keras.Model(
inputs=model1.inputs,
outputs=model2_output
)
答案 2 :(得分:0)
上述方法可以正常工作。但是,当尝试使用modelC.summary()
时,它将仅打印modelA和modelB名称。因为您正在创建其中具有模型的模型。表示模型C具有模型A和模型B,而不具有层。但是modelA和modelB具有图层,因此您可以访问modelA.summary()
,modelB.summary()
。您不需要在modelC中发生的事情。因为它只是将modelA和modelB放在一起,就像一个模型一样。
要获得modelC.summary()
,您只需遵循以下步骤即可:
modelC = Sequential()
#since modelA input shape is also input shape for modelC
modelC.add(modelA.input)
# this adds all layers to modelC from modelA
for layer in modelA.layers:
modelC.add(layer)
# since modelA output is input to modelB, you don't want any Input here, just add layers stacked to previous layers in modelC from modelB
for layer in modelB.layers:
modelC.add(layer)
要检查整体模型C,请参见modelC.input
,该参数必须与modelA.input
和modelC.output
,必须与modelB.output
匹配。要检查整个模型,modelC.summary()
,并验证模型A和模型B中的所有图层是否都在模型C中。如有任何疑问,请随时询问。上面的内容很有用,您不需要太多的工作,但是由于您要求输入图层名称和连接,因此我对您进行了答复。