PyTorch中DataLoader引发多进程RuntimeError的修复咨询
问题修复:PyTorch DataLoader多进程启动RuntimeError
你的推测没错,这个错误确实由DataLoader的num_workers=4参数引发。Windows系统下Python多进程默认采用spawn启动方式,子进程会重新执行主模块的全部代码,如果没有用if __name__ == '__main__':包裹核心执行逻辑,子进程会递归创建DataLoader并启动新进程,最终触发这个错误。
修复要点
- 将所有实际执行操作的代码(创建数据集、DataLoader、读取数据、显示图像等)放入
if __name__ == '__main__':代码块,确保只有主进程执行这些逻辑 freeze_support()放在该代码块的最开头(Windows下不打包成可执行文件时可省略,但加上更兼容)
修复后的完整代码
from multiprocessing import freeze_support import torch import torch.nn as nn import torchvision import torch.optim as optim from torch.optim import lr_scheduler import numpy as np from torchvision import datasets,models, transforms import time import os import copy import matplotlib.pyplot as plt # import torch.backends.cudnn as cudnn # cudnn.benchmark = True plt.ion() # interactive mode def imshow(inp,title=None): inp =inp.numpy().transpose((1,2,0)) mean = np.array([0.485, 0.456, 0.406]) std = np.array([0.229, 0.224, 0.225]) inp = std * inp + mean inp = np.clip(inp, 0, 1) plt.imshow(inp) if title is not None: plt.title(title) plt.pause(0.001) # pause a bit so that plots are updated if __name__ == '__main__': freeze_support() path ='C:/Users/User/PycharmProjects/AI_Project/hymenoptera_data' data_transforms ={ 'train':transforms.Compose([ transforms.RandomResizedCrop(224), transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), 'val':transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225]) ]), } image_datasets ={x:datasets.ImageFolder(os.path.join(path,x),data_transforms[x]) for x in ['train','val']} dataloaders ={x: torch.utils.data.DataLoader(image_datasets[x],batch_size=4,shuffle=True,num_workers=4) for x in ['train','val']} class_names = image_datasets['train'].classes device =torch.device('cuda' if torch.cuda.is_available() else 'cpu') inputs,classes =next((iter(dataloaders['train']))) out =torchvision.utils.make_grid(inputs) imshow(out,title=[class_names[x]for x in classes])
内容的提问来源于stack exchange,提问作者user466534
相关产品推荐
相关产品推荐

