【问题标题】:Impact of using data shuffling in Pytorch dataloader在 Pytorch 数据加载器中使用数据混洗的影响
【发布时间】:2019-06-18 15:36:19
【问题描述】:

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

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

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

我想知道是否会发生这种情况,因为在第一种情况下,网络在几个实例中只显示一个类,一个接一个地连续显示,导致网络在训练期间泛化能力差,还是背后有其他原因?

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

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

【问题讨论】:

    标签: neural-network pytorch


    【解决方案1】:

    是的,它完全会影响结果!打乱我们用来拟合分类器的数据顺序非常重要,因为不同时期之间的批次看起来并不相似。

    检查Data Loader Documentation 它说: “shuffle (bool, optional) – 设置为 True 让数据在每个 epoch 重新洗牌”

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

    在您的情况下,准确性的大幅提高(由于缺乏对数据集的了解)可能是由于数据集是如何“组织”的,例如,每个类别都属于不同的批次,并且在每个epoch,一个批次包含相同的类别,当您进行测试时,这会导致非常差的准确性。

    【讨论】:

    • 补充一点:每个类都有 20-60 个实例,并且由于我的 batch_size 是 32,所以大多数情况下一个批次有一个带有 shuffle=False 选项的类的实例。这导致了如此低的准确度分数
    • 这也是我的理解,@JosepJoestar。但如果确实如此,为什么不将shuffle 设置为True 作为其默认值?我不明白为什么我会希望它设置为False,除非在某种演示或教程中我故意想要一个确定性(但不太理想)的结果。
    【解决方案2】:

    PyTorch 做了很多很棒的事情,其中​​之一就是 DataLoader 类。

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

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

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

    如果是SequentionalSampler,它看起来像这样:

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

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

    当您设置shuffle=True 时,不会使用SequentionalSampler,而是使用RandomSampler

    这可能会改善学习过程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-27
      • 2021-03-31
      • 1970-01-01
      • 2021-03-27
      • 2020-10-09
      • 2019-01-13
      相关资源
      最近更新 更多