如何在keras中垂直堆叠训练模型?

时间:2018-04-30 00:25:03

标签: python tensorflow keras

我在keras中有两个经过训练的模型,我想将一个模型堆叠在另一个上面以形成一个单一的模型。我想这样做是为了将训练有素的模型合二为一。

enter image description here

我认为merge(Merge)用于水平堆叠模型,而我想垂直堆栈keras功能API模型。

PS:输出1的形状与输入2

相同

3 个答案:

答案 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.inputmodelC.output,必须与modelB.output匹配。要检查整个模型,modelC.summary(),并验证模型A和模型B中的所有图层是否都在模型C中。如有任何疑问,请随时询问。上面的内容很有用,您不需要太多的工作,但是由于您要求输入图层名称和连接,因此我对您进行了答复。