调用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
相关产品推荐
相关产品推荐

