加载保存的模型时为何出现BadZipFile错误?
解决pickle加载模型时的BadZipFile错误
可能原因
- 模型文件保存时损坏:比如保存过程中程序崩溃、磁盘写入故障,导致文件不完整,pickle解析时误判为zip格式(损坏的文件头部可能和zip标识重合)
- 保存方式错误:部分深度学习框架(如TensorFlow/Keras)默认用SavedModel或H5格式保存模型,这类文件不是纯pickle对象,直接用
pickle.load会报错 - 文件扩展名不符:虽然后缀是
.sav,但实际是zip格式的模型包,却被当作普通pickle文件加载
解决办法
1. 重新生成模型文件
如果能重新运行训练代码,用对应框架的正确方式保存:
- 若是scikit-learn等传统机器学习模型,用pickle正常保存:
import pickle # 假设model是训练好的模型 with open('breast_cancer_classification_nn_model.sav', 'wb') as f: pickle.dump(model, f)
- 若是TensorFlow/Keras模型,用框架自带方法保存加载:
# 保存 model.save('breast_cancer_model.h5') # 加载 from tensorflow.keras.models import load_model breast_cancer_model = load_model('breast_cancer_model.h5')
2. 检查文件完整性
- 对比正常模型文件的大小,如果当前文件明显偏小,说明文件损坏,重新获取完整的模型文件
- 用文本编辑器查看文件头部:正常pickle文件以
\x80\x04\x95开头,zip文件以PK\x03\x04开头。如果是PK开头,说明是zip格式,不能用pickle加载
3. 验证文件格式
用zipfile模块测试文件是否为有效zip:
import zipfile try: with zipfile.ZipFile('breast_cancer_classification_nn_model.sav', 'r') as zf: print("是zip文件,包含内容:", zf.namelist()) except zipfile.BadZipFile: print("不是zip文件,大概率是原文件已损坏")
内容的提问来源于stack exchange,提问作者Jæcob
相关产品推荐
相关产品推荐

