加载Pickle序列化ML模型触发FileNotFoundError的解决方案咨询
解决Pickle模型加载FileNotFoundError的步骤
1. 确认目标Pickle文件是否真实存在
- 在云环境终端执行命令
ls /home/jovyan/work,查看目录下是否有对应的.pickle文件。如果没有,说明之前的序列化操作未成功生成文件,或是云环境的临时存储在会话结束后清空了文件。 - 这种情况下,你需要先完整运行一次包含
write_pickle的代码,确保模型被正确保存到指定路径,之后再注释写入和拟合代码进行加载测试。
2. 修复路径拼接的潜在问题
你的读写函数直接用字符串拼接路径,容易因路径末尾缺少斜杠导致错误:
- 例如
path为"/home/jovyan/work"(末尾无斜杠)时,拼接后会变成"/home/jovyan/workmodel.pickle",直接导致路径无效。 - 建议改用
os.path.join自动处理路径分隔符,避免手动拼接错误:import os import pickle def write_pickle(path, model_object, save_as:str): full_path = os.path.join(path, f"{save_as}.pickle") with open(full_path, "wb") as to_write: pickle.dump(model_object, to_write) def read_pickle(path, saved_model_name:str): full_path = os.path.join(path, f"{saved_model_name}.pickle") with open(full_path, 'rb') as to_read: model = pickle.load(to_read) return model
3. 排查云环境的存储特性
- 多数云笔记本环境(如JupyterHub、Kaggle Kernel)的默认工作目录属于临时存储,会话结束后文件会被自动清理。如果之前的Pickle文件是在上一个会话生成的,当前会话自然无法找到。
- 解决方法:将模型保存到云环境的持久化存储位置(如绑定的云存储桶、用户专属持久目录),而非临时工作目录。
4. 验证文件权限
- 执行命令
ls -l /home/jovyan/work查看文件权限,确保当前用户拥有该文件的读取权限。如果权限不足,执行chmod +r /home/jovyan/work/your_model_name.pickle添加读取权限。
5. 检查函数调用的参数一致性
- 确认调用
read_pickle时传入的saved_model_name,和调用write_pickle时的save_as完全一致(包括大小写、拼写、特殊字符),比如保存时用"rf_model",读取时不能写成"RF_Model"。
内容的提问来源于stack exchange,提问作者M_Sabatino
相关产品推荐
相关产品推荐

