pytorch 深度学习按顺序高效加载数据

时间:2021-03-08 00:11:58

标签: python machine-learning deep-learning pytorch resnet

我一直在对 2 万张“图像”进行神经网络分析,每张图像以 100 * 100 * 100 个神经元的强度形式表示。

x = np.loadtxt('imgfile')
x = x.reshape(-1, img_channels, 100, 100, 100)
//similarly for target variable 'y'

上面,x 的第一个维度将是图像的数量。我正在使用 DataLoader 在每次迭代期间获取适当数量的图像进行训练,如下所示。

batch_size = 16
traindataset = TensorDataset(Tensor(x[:-testdatasize]), Tensor(y[:-testdatasize]) )
train_loader = DataLoader(dataset=traindataset, batch_size=batch_size, shuffle=True)

for epoch in range(num_epochs):
    for i, (data,targets) in enumerate(train_loader):   
        ... 

我希望将图像数量增加到 50k,但受计算机内存限制(imgfile 为 ~50 GB)。

我想知道是否有一种有效的方法来处理所有数据?比如,与其加载整个 imgfile,我们可以先将它们分成多个集合,每个集合有 batch_size 个图像,并在训练期间定期加载这些集合。我不完全确定如何实现这一点。

我在这里使用 Keras 发现了一些类似的想法:https://machinelearningmastery.com/how-to-load-large-datasets-from-directories-for-deep-learning-with-keras/

请向我指出使用 pytorch 实现的任何类似想法,或者您有任何想法。

1 个答案:

答案 0 :(得分:0)

在发布问题后挖掘了一段时间,发现当然有一种使用 torch.utils.data.Dataset 的方法。每个图像数据都可以保存在一个单独的文件中,所有文件名都列在“filelistdata”中。使用 DataLoader 调用时,只会将 batch_size 数量的图像加载到内存中(在后台,getitem 方法将获取图像)。以下对我有用:

traindataset = CustDataset(filename='filelistdata', root_dir=root_dir)

train_loader = DataLoader(dataset=traindataset, batch_size=batch_size, num_workers = 16)

num_workers 对性能非常重要,应该高于您使用的 Cpu 数量(我上面使用的是 4 个 CPU)。发现以下资源可用于回答此问题。

How to split and load huge dataset that doesn't fit into memory into pytorch Dataloader?

https://stanford.edu/~shervine/blog/pytorch-how-to-generate-data-parallel

https://www.youtube.com/watch?v=ZoZHd0Zm3RY

相关问题