我一直在对 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 实现的任何类似想法,或者您有任何想法。
答案 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