如何加载使用了自定义损失函数的Keras history pickle保存对象
报错原因
Keras的History对象内部绑定了训练关联的模型元信息,其中包含自定义损失函数的引用。pickle反序列化时需要匹配到对应名称的函数实现才能完成对象重建,找不到对应的custom_loss就会触发该报错。
解决方案
方案1(最推荐,适配所有场景,无后续依赖问题)
如果仅需要训练过程的指标数据(损失、准确率等),保存时直接序列化history.history字典即可,该字典是纯Python原生数据结构,没有绑定任何Keras模型依赖:
# 保存侧代码 with open('history.pkl', 'wb') as file: pickle.dump(history.history, file) # 读取侧代码,无需任何额外配置即可正常加载 with open('history.pkl', 'rb') as file: history_dict = pickle.load(file)
读取到的history_dict包含所有你需要的训练、验证指标数值,和原history.history的使用方式完全一致。
方案2(适配已序列化完整History对象的场景)
如果已经保存了完整的History对象,需要读取时按以下步骤操作:
- 先在当前运行环境中声明你原本实现的
custom_loss函数(如果不需要实际调用损失函数逻辑,仅做占位也可以,只要函数名匹配即可) - 用Keras的自定义对象上下文管理器包裹加载逻辑:
from keras.utils import CustomObjectScope # 原custom_loss实现,或同名占位函数 def custom_loss(y_true, y_pred): # 此处替换为你原本的损失函数逻辑,仅占位的话可以随便返回一个合法值 return y_true - y_pred with CustomObjectScope({'custom_loss': custom_loss}): with open('history.pkl', 'rb') as file: history = pickle.load(file)
加载完成后可以正常访问history.history获取训练指标。
内容的提问来源于stack exchange,提问作者idpd15
相关产品推荐
相关产品推荐

