使用pickle.load加载模型时出错,寻求同类问题反馈与解决方案
加载Pickle保存的Keras模型时出现ModuleNotFoundError的问题
很多人都碰到过这类问题,你运行代码时出现的ModuleNotFoundError: No module named 'keras.engine.training',主要是Keras版本兼容或模型保存方式不当导致的,以下是常见原因和解决思路:
常见原因及解决办法
Keras版本不匹配
保存模型时使用的Keras版本,和当前运行环境的Keras版本差异过大。旧版Keras的keras.engine.training模块在新版中已经调整了路径(比如迁移到keras.src.engine.training),导致pickle加载时找不到对应模块。
解决方式:- 安装与保存模型时一致的Keras版本,比如视频中用的是Keras 2.x,可执行:
pip install keras==2.15.0 - 临时兼容处理(不推荐长期使用):在加载模型前手动映射模块路径
import sys from keras.src.engine import training sys.modules['keras.engine.training'] = training pickle_in = open("venv/model_trained.p","rb") model = pickle.load(pickle_in)
- 安装与保存模型时一致的Keras版本,比如视频中用的是Keras 2.x,可执行:
模型保存方式不符合Keras规范
Keras官方并不推荐用pickle直接保存模型,因为pickle会序列化整个模型对象,高度依赖当时的环境结构。官方推荐使用model.save()和load_model()来保存加载,兼容性更好。
解决方式:
如果能重新获取原模型,替换成官方方法保存加载:# 原视频中保存模型的代码替换为 model.save("venv/model_trained.h5") # 加载模型时用以下代码 from keras.models import load_model model = load_model("venv/model_trained.h5")虚拟环境不一致
当前运行代码的虚拟环境和视频中的环境包版本、结构不同,也会导致这类错误。
解决方式:检查视频中用到的依赖版本,重新创建匹配的虚拟环境并安装对应包。
内容的提问来源于stack exchange,提问作者Bhetrand Dwilangga
相关产品推荐
相关产品推荐

