【发布时间】:2021-02-18 07:04:54
【问题描述】:
我在 keras 中有两个经过训练的模型,我想将一个堆叠在另一个之上以形成一个模型。我想这样做是为了将我训练的模型合二为一。
我认为 merge(Merge) 用于水平堆叠模型,而我想垂直堆叠 keras 功能 API 模型。
PS : 输出 1 的形状与输入 2 相同
【问题讨论】:
标签: python tensorflow keras
我在 keras 中有两个经过训练的模型,我想将一个堆叠在另一个之上以形成一个模型。我想这样做是为了将我训练的模型合二为一。
我认为 merge(Merge) 用于水平堆叠模型,而我想垂直堆叠 keras 功能 API 模型。
PS : 输出 1 的形状与输入 2 相同
【问题讨论】:
标签: python tensorflow keras
inputA = Input(input_shape_for_A)
outputA = modelA(inputA)
outputB = modelB(outputA)
modelC = Model(inputA, outputB)
【讨论】:
inputA = Input(shapeA)、inputB = Input(shapeB)....定义多个输入。
上述方法效果很好。但是当尝试modelC.summary() 时,它只会打印模型A、模型B 的名称。因为您正在创建一个包含模型的模型。意味着模型C 有模型A 和模型B,而不是层。但是modelA和modelB有层,所以你可以访问modelA.summary(),modelB.summary()。你不需要modelC中发生的事情。因为它只是将模型A 和模型B 放在一起,就像一个模型一样。
要获得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 中。如果有任何疑问,请随时询问。以上内容很有用,您不需要这么多的工作,但是由于您要求提供层名称和连接,所以我回复了您。
【讨论】:
与接受的答案类似,此方法无需重新定义输入层即可工作。
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
)
【讨论】: