调用tf.keras.models.load_model加载Keras模型时出现AttributeError错误求助
问题与解决方法
问题详情
使用代码Loaded_model = tf.keras.models.load_model('model.keras')(或.h5格式)加载本地保存的模型时触发以下错误:
AttributeError: Exception encountered when calling Flatten.call(). 'list' object has no attribute 'shape'
环境信息:
- TensorFlow版本:2.16.1
- Python版本:3.12.2
- 异常现象:本地保存的两种格式模型均无法加载;相同代码在Google Colab中可正常保存并加载,但Colab加载本地训练的模型同样失败。
可能原因
错误核心是Flatten层接收到的输入是列表对象而非预期的张量,通常出现在迁移学习场景中:部分预训练模型的output属性返回的是张量列表(而非单个张量),若直接将其传入Flatten层,保存模型后会导致加载时序列化异常。
解决步骤
修复模型构建代码
检查模型定义中Flatten层的输入来源,若使用预训练模型,确保取到的是单个张量而非列表。例如:# 错误写法:直接传入预训练模型的output(可能是列表) x = Flatten()(base_model.output) # 正确写法:取列表中的第一个张量(根据实际情况调整索引) x = Flatten()(base_model.output[0])重新训练并保存模型后,即可正常加载。
加载权重而非完整模型(适用于已训练完成的模型)
若无法重新训练,可先构建结构正确的模型,再单独加载权重:# 先构建与训练时一致的正确模型结构 def build_model(): base_model = tf.keras.applications.ResNet50(weights='imagenet', include_top=False) x = Flatten()(base_model.output[0]) # 确保输入是单个张量 outputs = tf.keras.layers.Dense(10, activation='softmax')(x) return tf.keras.Model(inputs=base_model.input, outputs=outputs) model = build_model() # 加载权重文件(注意保存时需用model.save_weights()) model.load_weights('model_weights.h5')排查路径与版本一致性
- Windows系统中路径需使用双反斜杠
\\或原始字符串r'path/to/model',避免转义字符问题; - 确认本地与Colab的TensorFlow版本完全一致,细微版本差异可能导致序列化不兼容。
- Windows系统中路径需使用双反斜杠
内容的提问来源于stack exchange,提问作者Tharindu Madhusanka
相关产品推荐
相关产品推荐

