我一直在对两万个“图像”进行神经网络分析,每个图像以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)的限制。
我想知道是否有一种有效的方法来处理所有的数据?例如,与加载整个the文件不同,我们可以首先将它们划分为多个集合,每个集合具有batch_size个数的图像,并在训练期间定期加载这些集合。我不完全确定如何实现这一点。
我在这里找到了一些使用Keras的类似想法:https://machinelearningmastery.com/how-to-load-large-datasets-from-directories-for-deep-learning-with-keras/
请告诉我用pytorch实现的任何类似的想法,或者你有任何想法。
发布于 2021-03-18 08:04:41
在发布这个问题后挖掘了一段时间,发现当然有一种使用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对于性能非常重要,并且应该高于您正在使用的Cpus数量(我在上面使用了4个cpus )。我发现以下资源对回答这个问题很有用。
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://stackoverflow.com/questions/66522854
复制相似问题