tf.keras.models.load_model加载模型报合并层需列表输入错误如何解决
问题根因分析
该错误的核心原因是模型中使用了Keras的合并类层(比如Concatenate、Add、Multiply等),保存模型后的序列化配置在加载重构计算图时,合并层的输入被错误识别为单张量,而非预期的列表/元组输入,常见触发场景有两个:
- 构建模型时合并层的调用写法不规范,输入没有正确包裹成列表传入
- 所用的TensorFlow版本(2.3~2.6区间版本居多)存在SavedModel序列化漏洞,会丢失合并层的输入元信息
可落地解决方法
方法1:加载时关闭编译选项
优先尝试加载时添加compile=False参数,跳过编译阶段的图校验,加载后按需手动编译即可,推理场景不需要额外操作:reloaded = tf.keras.models.load_model('gait_gender_model', compile=False)如需继续训练,加载完成后调用
reloaded.compile(优化器, 损失函数, 评估指标)完成编译即可。方法2:修正合并层的调用写法
如果还能获取到训练代码,检查所有合并层的调用逻辑,确保输入一定被包裹在列表中:
错误写法示例:concat_layer = tf.keras.layers.Concatenate()(tensor1, tensor2)正确写法示例:
concat_layer = tf.keras.layers.Concatenate()([tensor1, tensor2])修正后重新训练保存模型,后续加载就不会触发该错误。
方法3:通过权重加载绕开序列化问题
训练代码可获取的前提下,也可以选择仅保存模型权重,加载时先初始化完全同结构的模型再导入权重:
保存阶段代码:Gait_gender_model.save_weights('gait_gender_weights.h5')加载阶段代码:
# 先构建和训练时结构完全一致的模型 model = build_your_model() # 导入训练好的权重 model.load_weights('gait_gender_weights.h5')方法4:调整TensorFlow版本
如果你当前使用的是2.3~2.6区间的TensorFlow版本,可以尝试升级到2.7及以上版本,或者降级到2.2版本,该序列化bug在部分版本迭代中已经被修复。
内容的提问来源于stack exchange,提问作者Nantanit Van Somboon
相关产品推荐
相关产品推荐

