【问题标题】:How to vertically stack trained models in keras?如何在 keras 中垂直堆叠训练好的模型?
【发布时间】:2021-02-18 07:04:54
【问题描述】:

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

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

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

【问题讨论】:

标签: python tensorflow keras


【解决方案1】:
inputA = Input(input_shape_for_A)
outputA = modelA(inputA)
outputB = modelB(outputA)

modelC = Model(inputA, outputB)

【讨论】:

  • 我必须以任何方式连接模型吗??
  • 答案中的代码正是连接模型的方式。
  • 您可以使用三种模型(A、B 和 C)中的任何一种,就像它们是松散的一样,但它们的重量是共享的。
  • 谢谢,它有效。我可以再问你一个问题吗?如何打印 modelC 的整个模型摘要?我尝试了 modelC.summary() ,但是那个游戏我构成了 modelC 的模型的名称(如 modelA 和 modelB)。如何获取图层名称及其连接??
  • inputA = Input(shapeA)inputB = Input(shapeB)....定义多个输入。
【解决方案2】:

上述方法效果很好。但是当尝试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.inputmodelC.output,这必须匹配modelB.output。要检查整个模型,modelC.summary(),并验证模型A 和模型B 中的所有层是否都在模型C 中。如果有任何疑问,请随时询问。以上内容很有用,您不需要这么多的工作,但是由于您要求提供层名称和连接,所以我回复了您。

【讨论】:

    【解决方案3】:

    与接受的答案类似,此方法无需重新定义输入层即可工作。

    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
        )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      • 2020-06-20
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多