在Pytorch数据加载器中使用数据改组的影响

时间:2019-01-24 20:02:36

标签: neural-network pytorch

我通过使用Alexnet作为预训练模型并更改了最终输出层,实现了图像分类网络以对100个类别的数据集进行分类。 我在加载数据时注意到了

trainloader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=False)

,在大约10个时间段内,我在验证数据集上的准确度约为2-3%,但是当我刚刚更改shuffle=True并重新训练了网络时,在第一个时间段本身中,准确度就跃升到70%。

我想知道是否会发生这种情况,因为在第一种情况下,仅在少数情况下一个类一次连续显示一个网络,一个例子又一个例子,导致网络在训练过程中泛化能力差,或者背后是否还有其他原因? / p>

但是,我没想到会有如此大的影响。

P.S:两种情况下,所有代码和参数都完全相同,只是更改了shuffle选项。

2 个答案:

答案 0 :(得分:3)

是的,完全可以影响结果!改组我们用于分类器的数据的顺序非常重要,因为历元之间的批次看起来并不相同。

检查Data Loader Documentation时显示: “随机播放(布尔型,可选)–设置为True,以便在每个时期都对数据进行随机播放”

无论如何,它将使模型更加健壮,并避免过度/不足。

在您的情况下,准确性的大幅提高(由于对数据集缺乏了解)可能是由于数据集的“组织方式”所致,例如,每个类别分别属于不同的批次,并且在每个类别中时代开始,批次包含相同的类别,因此在进行测试时得出的准确性非常差。

答案 1 :(得分:3)

PyTorch做的很多事情都很出色,其中之一就是DataLoader类。

DataLoader类获取数据集(数据),设置batch_size(每批次要加载多少个样本),并从类列表中调用采样器:

  • DistributedSampler
  • SequentialSampler
  • RandomSampler
  • SubsetRandomSampler
  • WeightedRandomSampler
  • BatchSampler

enter image description here

采样器要做的关键是他们如何实现iter()方法。

对于SequentionalSampler,它看起来像这样:

def __iter__(self):
    return iter(range(len(self.data_source))) 

这将为data_source中的每个项目返回一个迭代器。

设置shuffle=True时将不使用SequentionalSampler,而是使用RandomSampler

这可以改善学习过程。