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

调用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层,保存模型后会导致加载时序列化异常。

解决步骤

  1. 修复模型构建代码
    检查模型定义中Flatten层的输入来源,若使用预训练模型,确保取到的是单个张量而非列表。例如:

    # 错误写法:直接传入预训练模型的output(可能是列表)
    x = Flatten()(base_model.output)
    
    # 正确写法:取列表中的第一个张量(根据实际情况调整索引)
    x = Flatten()(base_model.output[0])
    

    重新训练并保存模型后,即可正常加载。

  2. 加载权重而非完整模型(适用于已训练完成的模型)
    若无法重新训练,可先构建结构正确的模型,再单独加载权重:

    # 先构建与训练时一致的正确模型结构
    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')
    
  3. 排查路径与版本一致性

    • Windows系统中路径需使用双反斜杠\\或原始字符串r'path/to/model',避免转义字符问题;
    • 确认本地与Colab的TensorFlow版本完全一致,细微版本差异可能导致序列化不兼容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 05:12:35