使用pickle保存LSTM模型时报TypeError: can't pickle _thread.RLock objects求解决
LSTM模型保存报错解决方案
报错原因
你遇到的TypeError: can't pickle _thread.RLock objects报错,核心原因是TensorFlow/Keras框架构建的模型对象内部包含不可被pickle序列化的线程锁资源,通用序列化工具pickle不支持直接序列化这类框架原生模型对象。
可行解决方法
- 方案1:使用Keras官方提供的模型序列化接口(最推荐)
替换你代码末尾的pickle相关代码,直接用内置save方法存储模型:
# 保存模型,支持h5格式单文件存储,或者SavedModel格式目录存储 # 方式1:存为h5单文件 regressor.save('C:/Users/indore/Desktop/model.h5') # 加载模型时调用即可 from tensorflow.keras.models import load_model regressor = load_model('C:/Users/indore/Desktop/model.h5')
h5格式会完整保存模型结构、权重、编译配置、优化器状态,既可以直接推理,也可以继续训练。如果是TensorFlow 2.x版本,也可以选择存为SavedModel目录格式,只需要把保存路径改为目录路径即可,兼容性更强。
- 方案2:拆分存储模型结构与权重(适合需要自定义序列化的场景)
如果确实需要结合pickle使用,可以先拆分模型的结构和权重单独存储,再打包序列化:
# 保存阶段 import pickle # 导出模型结构为json字符串 model_struct = regressor.to_json() # 导出模型权重 model_weights = regressor.get_weights() # 打包结构和权重后用pickle存储 with open('C:/Users/indore/Desktop/model.sav', 'wb') as f: pickle.dump({'struct': model_struct, 'weights': model_weights}, f) # 加载阶段 from tensorflow.keras.models import model_from_json with open('C:/Users/indore/Desktop/model.sav', 'rb') as f: model_data = pickle.load(f) regressor = model_from_json(model_data['struct']) regressor.set_weights(model_data['weights']) # 如需继续训练,要重新调用compile方法配置优化器和损失函数
内容的提问来源于stack exchange,提问作者Prakhar Gupta
相关产品推荐
相关产品推荐

