模型导入时遇Concatenate错误:加载保存模型时报形状不匹配
解决加载JSON模型时Concatenate层形状不匹配的问题
这个问题我之前也碰到过!核心原因是JSON格式只保存模型的结构拓扑,不会固化训练时的固定输入/输出形状信息——你训练时用的是固定尺寸的输入,导致其中一个分支的卷积层输出是固定空间维度(比如(None,12,12,512)),但加载JSON模型时,另一个分支的形状被默认解析为动态的(None,None,None,512),拼接时自然触发形状不匹配的错误。
下面是几个靠谱的解决方案,按优先级排序:
1. 优先使用完整模型保存格式(推荐)
别再分开存JSON和权重了,TensorFlow/Keras提供的完整模型保存格式(.h5或SavedModel文件夹)会同时保存结构、权重和形状信息,加载时完全不会有这种问题:
保存时:
# 保存为.h5格式 model.save('my_trained_model.h5') # 或者保存为SavedModel格式(更推荐,兼容TF2.x) model.save('my_trained_model_dir')
加载时:
from tensorflow.keras.models import load_model # 加载.h5模型 model = load_model('my_trained_model.h5') # 或者加载SavedModel model = load_model('my_trained_model_dir')
2. 必须用JSON加载时,手动固化输入形状
如果因为某些原因必须用JSON+权重的方式,那加载时需要手动指定输入形状并构建模型,强制所有分支的形状对齐:
加载步骤:
from tensorflow.keras.models import model_from_json # 1. 加载模型结构 with open('model.json', 'r') as f: model_json = f.read() model = model_from_json(model_json) # 2. 手动指定训练时的输入形状,构建模型(替换成你实际的输入尺寸) model.build(input_shape=(None, 224, 224, 3)) # 比如你的输入是224x224的RGB图 # 3. 加载权重 model.load_weights('model_weights.h5')
3. 排查模型分支的形状逻辑
如果上面的方法没用,你需要检查训练时的模型结构:
- 确认两个拼接分支的卷积操作都是基于固定输入尺寸设计的,比如下采样次数固定,不会出现动态的空间维度
- 训练时打印拼接前两个分支的输出形状(
print(branch1.output.shape, branch2.output.shape)),确保都是固定的空间维度(比如(None,12,12,512)) - 保存JSON前,确保模型已经通过
model.build()明确了输入形状,避免结构中存在未确定的动态形状
内容的提问来源于stack exchange,提问作者D.Giunchi
相关产品推荐
相关产品推荐

