问题:运行图像任务py脚本报错
\torch_py310\lib\multiprocessing\spawn.py", line 126, in _main self = reduction.pickle.load(from_parent) EOFError: Ran out of input
解决方法:
报错根因(一句话)
AttributeError: Can't pickle local object 'main.<locals>.PVImageDataset'
👉Dataset 类定义在main()函数内部,Windows 的 spawn 机制无法 pickle(序列化)它。
方案一(推荐,规范做法)
修改点 1:把PVImageDataset移到main()外面
原来(错误位置)
def main(): ... class PVImageDataset(Dataset): ...
修改为(正确)
放在文件最外层(main()之前)
然后main() 里只保留使用:
train_dataset = PVImageDataset(train_paths, train_labels, train_transform) val_dataset = PVImageDataset(val_paths, val_labels, val_transform)
✔ 这是标准工业级写法
✔ 保留num_workers=2
✔ 训练速度正常
方案二(临时规避,不推荐)
如果你现在只想立刻跑起来:
修改点 2:把num_workers设为 0
train_loader = DataLoader( train_dataset, batch_size=BATCH_SIZE, shuffle=True, num_workers=0, # ← 改这里 pin_memory=True, ) val_loader = DataLoader( val_dataset, batch_size=BATCH_SIZE, shuffle=False, num_workers=0, # ← 改这里 pin_memory=True, )
✔ 不需要改 Dataset 位置
✘ 数据加载慢
✘ 不适合正式实验