You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需额外训练合并两个MNIST分类模型实现0-9数字分类?

合并MNIST分类模型的正确方法

为什么你的代码报错

你之前用Sequential直接堆叠两个模型的写法会报错,核心原因是:第一个模型输出的是10维概率向量,而第二个模型需要的是28×28×1的图片输入,两者形状完全不匹配,导致模型无法正常构建。

两种无需额外训练的合并方案

方案1:直接复用两个模型的输出(最直接高效)

因为你的两个模型分别对0-4、5-9的分类结果准确,我们可以直接取第一个模型的前5类输出(对应数字0-4)、第二个模型的后5类输出(对应数字5-9),拼接成完整的0-9分类结果:

import tensorflow as tf
from tensorflow import keras

# 加载训练好的两个模型
model_0_4 = keras.models.load_model('final_model_0_4.h5') 
model_5_9 = keras.models.load_model('final_model_5_9.h5')  

# 定义统一的图片输入层
input_img = keras.layers.Input(shape=(28, 28, 1))

# 获取两个模型的原始输出
output_0_4 = model_0_4(input_img)
output_5_9 = model_5_9(input_img)

# 拼接有效输出:取model_0_4的0-4类概率,model_5_9的5-9类概率
combined_output = keras.layers.concatenate(
    [output_0_4[:, :5], output_5_9[:, 5:]],
    axis=1
)

# 构建合并后的完整模型
combined_model = keras.models.Model(inputs=input_img, outputs=combined_output)

# 编译模型(无需训练,编译仅为了支持保存和调用predict方法)
opt = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)
combined_model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])

# 保存合并后的模型
combined_model.save('combined_model.h5')

方案2:基于特征层拼接(更灵活的扩展方案)

如果你想利用两个模型的特征提取能力,可去掉它们的输出层,拼接中间特征后接新的输出层(若无需训练,新输出层用随机初始化,效果略逊于方案1):

import tensorflow as tf
from tensorflow import keras

# 加载训练好的两个模型
model_0_4 = keras.models.load_model('final_model_0_4.h5') 
model_5_9 = keras.models.load_model('final_model_5_9.h5')  

# 去掉最后一层softmax输出层,取倒数第二层的100维特征输出
feat_extractor_0_4 = keras.models.Model(
    inputs=model_0_4.input,
    outputs=model_0_4.layers[-2].output
)
feat_extractor_5_9 = keras.models.Model(
    inputs=model_5_9.input,
    outputs=model_5_9.layers[-2].output
)

# 定义统一输入层
input_img = keras.layers.Input(shape=(28, 28, 1))

# 获取两个模型的特征向量
feat_0_4 = feat_extractor_0_4(input_img)
feat_5_9 = feat_extractor_5_9(input_img)

# 拼接两个特征向量
combined_feat = keras.layers.concatenate([feat_0_4, feat_5_9], axis=1)

# 添加新的10分类输出层
final_output = keras.layers.Dense(10, activation='softmax')(combined_feat)

# 构建合并后的模型
combined_model = keras.models.Model(inputs=input_img, outputs=final_output)

# 编译模型
opt = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9)
combined_model.compile(optimizer=opt, loss='categorical_crossentropy', metrics=['accuracy'])

# 保存模型
combined_model.save('combined_model.h5')

关键注意事项

  • 必须使用TensorFlow的函数式API处理多模型拼接场景,Sequential仅适用于单输入单输出的线性堆叠,无法应对这种多模型组合需求。
  • 优先选择方案1,它完全复用了两个模型已训练好的分类结果,不需要任何额外训练,直接就能得到0-9的准确分类。

内容的提问来源于stack exchange,提问作者beginner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 22:13:20