如何在Keras中垂直堆叠已训练模型?两模型输出1与输入2形状一致
如何在Keras中垂直堆叠两个训练好的函数式API模型
没问题!你说的“垂直堆叠”其实就是把两个模型串联起来——让模型1的输出直接作为模型2的输入,形成一个端到端的新模型。既然你已经确认模型1的输出形状和模型2的输入形状完全匹配,这个操作在Keras函数式API里非常简单,具体步骤如下:
步骤1:准备好你的训练模型
假设你已经加载了两个训练完成的模型,分别命名为model1和model2。如果是从文件加载的(比如用load_model()),确保加载过程正常(不需要额外设置compile=False,除非你不想保留原模型的编译配置)。
步骤2:用函数式API串联模型
直接利用Keras的函数式API,把模型1的输出接入模型2的输入:
# 如果是原生Keras from keras.models import Model # 如果是TensorFlow Keras(tf.keras) # from tensorflow.keras.models import Model # 获取模型1的输入层作为新模型的输入 input_tensor = model1.input # 让模型1处理输入,得到输出后传入模型2 x = model1.output x = model2(x) # 构建最终的串联模型 combined_model = Model(inputs=input_tensor, outputs=x)
步骤3:验证与使用
- 你可以打印新模型的结构,确认两个模型已经成功串联:
combined_model.summary()
- 如果需要继续训练这个新模型,可以重新编译它(根据你的任务需求调整优化器、损失函数等):
combined_model.compile( optimizer='adam', loss='categorical_crossentropy', # 根据你的任务替换成对应损失 metrics=['accuracy'] )
- 要是只用于推理,直接调用
combined_model.predict()就可以了。
注意事项
- 串联时,Keras会自动复用两个模型已训练好的权重,不用担心权重丢失。
- 如果模型2原本有自己的输入层,调用
model2(x)时会自动忽略原输入层,改用传入的x作为输入,完全符合我们的需求。
内容的提问来源于stack exchange,提问作者Manipal King
相关产品推荐
相关产品推荐

