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

调用load_model加载Keras模型时报错'module' object is not callable

报错原因与解决方案

这个TypeError: 'module' object is not callable虽然报错栈指向Keras内部源码,本质是模型反序列化阶段,Keras尝试实例化层对象时,拿到的是模块对象而非可调用的层类/函数对象,和你已知的模块名与函数名重名冲突属于同一类问题。

排查步骤

  • 第一步:确认自定义组件是否正确传入
    你在训练模型时如果使用了自定义层、自定义损失函数、自定义评估指标等非Keras内置组件,加载模型时必须通过custom_objects参数显式传入这些组件的可调用实例,否则Keras会从默认命名空间查找,大概率会匹配到同名模块而非实际的类/函数。
    错误导入示例:如果你自定义了名为ConvDown的层,加载时写import custom_layers,直接将custom_layers.ConvDown传入custom_objects是正确的;如果误写为custom_layers(整个模块)传入,就会触发该报错。
  • 第二步:修正模型加载代码
    正确的加载写法参考:
    from tensorflow.keras.models import load_model
    # 显式导入所有自定义组件
    from custom_layers import ConvDown, ConvUp
    from custom_losses import dice_loss
    
    model = load_model(
      "your_trained_model.h5",
      custom_objects={
        "ConvDown": ConvDown,
        "ConvUp": ConvUp,
        "dice_loss": dice_loss
      }
    )
    
  • 第三步:定位未知的自定义组件
    如果你不清楚模型用到了哪些自定义组件,可以通过以下代码读取模型配置,筛选非内置层名:
    import h5py
    import json
    
    with h5py.File("your_trained_model.h5", "r") as f:
      model_config = json.loads(f.attrs.get("model_config"))
    # 遍历打印所有层的类名,找到不属于Keras内置的名称
    for layer in model_config["config"]["layers"]:
      print(layer["class_name"])
    
    拿到自定义层名后,对应检查你本地导入的对象是否为可调用的类/函数,而非模块对象即可。

常见避坑点

  • 训练与加载环境的自定义组件路径必须保持一致,路径差异会导致Keras无法匹配到正确的可调用对象
  • 不要使用import 模块名的方式导入自定义组件后直接传入custom_objects,必须显式导入到类/函数层级

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:54:03