先确认路径是否正确:用print(os.path.abspath("model.pth"))获取绝对路径,再在终端执行ls -l或dir验证文件存在且非空;路径含中文、空格或~时需用os.path.expanduser()和os.path.normpath()规范化;windows下反斜杠须写成r"c:\models\ckpt.pth"或"c:/models/ckpt.pth"。

PyTorch torch.load() 报 OSError: [Errno 2] No such file or directory 怎么办
这不是文件损坏,而是路径根本没找对。Python 的 os.path.exists() 不足以判断 PyTorch 能否真正加载——它只检查路径存在,不校验是否为合法的 pickle/zip 格式。先用最简方式确认路径可访问:
- 在代码里加一行
print(os.path.abspath("your_model.pth")),复制输出路径到终端执行ls -l <path></path>(Linux/macOS)或dir <path></path>(Windows),看文件是否真实存在、大小是否为 0 - 如果路径含中文、空格或波浪号
~,torch.load()在某些 Python 版本下会静默失败,务必用os.path.expanduser()和os.path.normpath()规范化 - Windows 上注意反斜杠:
"C:\models\ckpt.pth"是非法字符串(\m被当转义),必须写成r"C:\models\ckpt.pth"或"C:/models/ckpt.pth"
加载时抛 RuntimeError: unexpected EOF of file 或 pickle.UnpicklingError
这才是典型文件损坏:文件被截断、传输中断或磁盘坏道导致末尾数据丢失。PyTorch 的 .pth 实际是 ZIP(新版)或 Pickle(旧版)格式,无法靠肉眼识别损坏点:
- 用系统命令快速验证:
file your_model.pth—— 正常应输出Zip archive data或Python pickle data;若显示data或empty,基本已损坏 - 对 ZIP 格式(PyTorch ≥1.6 默认):运行
unzip -t your_model.pth,失败则说明 ZIP 结构异常,无法修复 - 不要尝试用
torch.load(..., map_location="cpu")绕过——损坏发生在反序列化底层,设备无关
如何在加载前自动校验 .pth 文件完整性
没有通用“校验和 API”,但可通过轻量级试探性加载规避崩溃:
- 用
try/except包裹torch.load()并限定超时(防止卡死):import torch import signal <p>class TimeoutException(Exception): pass def timeout_handler(signum, frame): raise TimeoutException() signal.signal(signal.SIGALRM, timeout_handler)</p><p>try: signal.alarm(5) # 最多等 5 秒 state_dict = torch.load("model.pth", map_location="cpu") signal.alarm(0) except (EOFError, OSError, RuntimeError, TimeoutException): print("文件损坏或不可读") state_dict = None</p> - 更可靠的方式是预读文件头:PyTorch ZIP 格式以
PK\x03\x04开头,Pickle 格式通常以\x80\x04(Pickle protocol 4)或\x80\x03开头。用open("model.pth", "rb").read(4)检查前 4 字节是否匹配,不匹配即拒绝加载
为什么 torch.load() 不报错却加载出空模型或参数全零
常见于跨版本保存/加载,或误将优化器状态字典当模型字典加载。本质是结构解析成功,但内容语义错位:
- 检查加载结果类型:
type(torch.load("model.pth"))—— 若返回dict且 key 含"optimizer"或"epoch",说明你加载的是训练快照(checkpoint),不是纯模型权重;需取ckpt["model"]或ckpt["state_dict"] - PyTorch 1.12+ 默认启用
_use_new_zipfile_serialization=True,旧版 PyTorch(weights_only=True,可能因 unsafe pickle 导致静默失败 - 模型定义与保存时的类名/模块路径不一致(如从
mylib.model改成src.model),会导致参数键名对不上,load_state_dict()报Missing key(s)但不终止——此时strict=False会让缺失参数保持初始化值(常为零)
文件损坏本身不可逆,关键在加载前用二进制头检测 + 路径规范化 + 类型判断三步过滤。很多人卡在第一步就用错路径拼接,后面所有校验都白做。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











