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

him*_*hyr 4 neural-network pytorch

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

trainloader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=False)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Jos*_*tar 5

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

查看Data Loader文档,其中显示:“随机播放(布尔型,可选)–设置为True以使数据在每个时期都重新随机播放”

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

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

  • 这也是我的理解,@JosepJoestar。但如果确实如此,为什么不将“shuffle”设置为“True”作为其默认值?我不明白为什么我希望将其设置为“False”,除了在某种演示或教程中,我故意想要一个确定性(但不太理想)的结果。 (5认同)

pro*_*sti 5

PyTorch做的很多事情很棒,其中之一就是DataLoader课程。

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

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

在此处输入图片说明

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

如果是这样的SequentionalSampler话:

def __iter__(self):
    return iter(range(len(self.data_source))) 
Run Code Online (Sandbox Code Playgroud)

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

当您设置shuffle=True的是沃尔德不使用SequentionalSampler,而是在RandomSampler

这可以改善学习过程。