Keras 3中无法使用pickle load()加载模型的问题求助
Keras 3.3.3加载Pickle模型报错的解决方法
问题场景
使用Python 3.10、Keras 3.3.3、TensorFlow 2.16.1环境,执行以下代码加载pickle保存的模型时:
file_name = "soil_model_fineTuned.pkl" with open(file_name, 'rb') as f: model = pickle.load(f)
出现报错:
model = pickle.load(f) ModuleNotFoundError: No module named 'keras.src.saving.pickle_utils'
改用joblib加载仍触发相同错误:
model = joblib.load(file_name)
报错详情:
File "/opt/miniconda3/envs/tensorflow/lib/python3.10/site-packages/joblib/numpy_pickle.py", line 658, in load obj = _unpickle(fobj, filename, mmap_mode) File "/opt/miniconda3/envs/tensorflow/lib/python3.10/site-packages/joblib/numpy_pickle.py", line 577, in _unpickle obj = unpickler.load() File "/opt/miniconda3/envs/tensorflow/lib/python3.10/pickle.py", line 1213, in load dispatch[key[0]](self) File "/opt/miniconda3/envs/tensorflow/lib/python3.10/pickle.py", line 1538, in load_stack_global self.append(self.find_class(module, name)) File "/opt/miniconda3/envs/tensorflow/lib/python3.10/pickle.py", line 1580, in find_class __import__(module, level=0) ModuleNotFoundError: No module named 'keras.src.saving.pickle_utils'
解决方案
1. 优先使用Keras官方加载方法
Keras 3不推荐用pickle/joblib保存模型,建议使用官方的model.save()和keras.models.load_model()。如果能重新访问原模型,先转存为Keras格式:
# 重新保存原模型为Keras官方格式 model.save("soil_model_fineTuned.keras") # 加载模型 import keras model = keras.models.load_model("soil_model_fineTuned.keras")
2. 手动映射缺失模块路径
若无法重新导出模型,可通过修改模块映射让pickle找到对应路径,加载前执行以下代码:
import sys import keras.src.saving # 将缺失的模块路径映射到现有模块 sys.modules['keras.src.saving.pickle_utils'] = keras.src.saving # 加载模型 import pickle file_name = "soil_model_fineTuned.pkl" with open(file_name, 'rb') as f: model = pickle.load(f)
3. 降级到匹配的Keras版本
如果模型是用旧版Keras保存的,可尝试降级Keras到保存时的版本(比如Keras 3.0.0):
pip install keras==3.0.0
加载成功后,立即用model.save()转存为Keras官方格式,避免后续版本兼容问题。
内容的提问来源于stack exchange,提问作者SouraOP
相关产品推荐
相关产品推荐

