加载pkl模型触发No module named 'keras.saving'报错如何解决
问题说明
执行file.py第32行pickle.load(open('model.pkl', 'rb'))加载本地序列化模型时,抛出ModuleNotFoundError: No module named 'keras.saving'错误,完整报错栈:
Using TensorFlow backend. Traceback (most recent call last): File "file.py", line 32, in <module> pickled_model = pickle.load(open('model.pkl', 'rb')) ModuleNotFoundError: No module named 'keras.saving'
报错原因
核心触发原因是当前运行环境的Keras/TensorFlow版本,和当初训练、导出model.pkl文件时使用的版本不匹配:keras.saving是Keras 2.12及以上版本才拆分出的独立模块路径,如果你当前环境安装的是2.12以下的旧版Keras,或是TensorFlow 2.11及更早版本内置的Keras,加载高版本Keras序列化生成的pickle模型时,就会找不到对应模块路径抛出错误。
额外说明:pickle序列化Keras模型本身不是官方推荐的存储方式,对运行环境的版本耦合度极高,跨环境、跨版本加载非常容易出现兼容问题。
解决步骤
按优先级依次尝试:
- 对齐版本:先执行
pip show keras查看当前环境的Keras版本,若不确定导出模型时的版本,先直接升级Keras和TensorFlow到最新正式版,再重新运行脚本:
绝大多数小版本差异导致的该问题,升级后可直接解决。pip install --upgrade keras tensorflow - 若升级后仍报错,且确认模型是用旧版Keras导出的,将当前环境的Keras、TensorFlow降到和导出模型匹配的版本即可,比如模型是基于Keras 2.8训练保存的,执行以下命令降级:
pip install keras==2.8.0 tensorflow==2.8.0 - 长期规避方案:放弃用pickle存储Keras模型,改用Keras官方提供的原生保存加载接口,版本兼容性远高于pickle:
保存模型时使用:
加载模型时使用:# 新版Keras使用.keras格式,旧版可替换为.h5后缀 model.save("model.keras")from tensorflow import keras model = keras.models.load_model("model.keras")
注意:跨大版本的Keras/TensorFlow模型文件官方不保证兼容,尽量保证训练保存和加载推理的环境大版本一致。
内容的提问来源于stack exchange,提问作者ChillGod
相关产品推荐
相关产品推荐

