当PyTorch在使用数据加载器(Dataloader)进行训练时,可能会发生锁死的情况,导致程序无法继续进行。下面是一些可能出现锁死的原因和解决方案:
原因1:数据集中存在损坏的图片
在数据加载时,如果存在损坏的图片,可能会导致程序锁死。可以通过try...except语句来处理异常,并跳过这些损坏的图片。例子如下:
from PIL import Image
import torch.utils.data as data
class MyDataset(data.Dataset):
def __init__(self, path_list):
self.path_list = path_list
def __len__(self):
return len(self.path_list)
def __getitem__(self, index):
try:
img = Image.open(self.path_list[index])
label = self.path_list[index].split("/")[-1].split(".")[0]
return img, label
except Exception as e:
print(f"Exception: {e}, image file: {self.path_list[index]}")
return None, None
这个数据集跳过了出现异常的图片并打印了错误信息。
原因2:数据集或数据加载器在使用时被多个线程同时访问
当多个线程同时访问数据集或数据加载器时,可能会导致程序锁死。为了避免这种情况,可以设置num_workers参数。num_workers指定了在数据加载过程中使用的线程数。如果num_workers设置太高,可能会导致线程之间竞争资源,从而导致程序锁死。如果num_workers设置太低,则可能会导致加载数据过慢而阻塞程序。在大多数情况下,适当设置num_workers为2或4即可。
import torch
import torch.utils.data as data
from torchvision import datasets, transforms
train_loader = data.DataLoader(
datasets.MNIST(
"./data/MNIST",
train=True,
download=True,
transform=transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,))]),
),
batch_size=64,
shuffle=True,
num_workers=2, # 设置2个线程
)
在这个例子中,数据集MNIST使用了2个线程。如果num_workers设置为1,则将只使用一个线程来加载数据,这可能会导致训练过程变慢。如果设置num_workers > 2,则可能会导致线程之间竞争资源,从而导致程序锁死。
以上是两个常见的导致PyTorch在使用数据加载器进行训练时锁死的原因和解决方案。除此之外,还可能存在其他导致程序锁死的问题,需要具体情况具体分析。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:pytorch锁死在dataloader(训练时卡死) - Python技术站