TensorFlow2.0训练交通标志模型后pickle序列化出现无法序列化_thread._local报错
问题原因
TensorFlow/Keras的模型实例内部包含无法被pickle序列化的线程本地存储对象、计算图上下文等资源,原生不支持直接用pickle序列化整个模型对象,因此会抛出该TypeError异常。
解决方案
推荐使用Keras官方提供的模型序列化接口,替换原有pickle保存代码即可,你当前使用的TensorFlow 2.0.0 + Keras 2.3.1版本完全支持下述用法:
方案1:保存完整模型(包含结构、权重、编译配置)
该方案不需要后续重新定义模型结构,直接加载即可使用,是最常用的方案。
保存代码
替换原代码末尾的pickle保存部分:
# 保存完整模型 model.save("model_trained.h5")
加载代码
from tensorflow.keras.models import load_model model = load_model("model_trained.h5")
方案2:仅保存模型权重
如果不需要保留编译配置,可选择只保存权重,文件体积更小,加载时需要先定义和训练时结构完全一致的模型。
保存代码
model.save_weights("model_trained_weights.h5")
加载代码
# 先初始化和训练时结构完全一致的模型 model = myModel() # 加载权重 model.load_weights("model_trained_weights.h5")
注意事项
如果运行保存代码时提示缺少h5py依赖,执行pip install h5py==2.10.0安装适配版本即可。
内容的提问来源于stack exchange,提问作者butterf0kker
相关产品推荐
相关产品推荐

