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选项。
是的,它完全可以影响结果!改组我们用于分类器的数据的顺序非常重要,因为历元之间的批次看起来并不相似。
查看Data Loader文档,其中显示:“随机播放(布尔型,可选)–设置为True以使数据在每个时期都重新随机播放”
无论如何,它将使模型更加健壮并避免过度拟合。
在您的情况下,准确性的大幅提高(由于对数据集缺乏了解)可能是由于数据集的“组织方式”所致,例如,每个类别归入不同的批次,并且在每个时期,批处理包含相同的类别,因此在测试时得出的准确性非常差。
PyTorch做的很多事情很棒,其中之一就是DataLoader课程。
DataLoader类获取数据集(数据),设置batch_size(每个批次要加载多少个样品),并从类列表中调用采样器:
DistributedSampler SequentialSampler RandomSampler SubsetRandomSamplerWeightedRandomSampler 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。
这可以改善学习过程。
| 归档时间: |
|
| 查看次数: |
2375 次 |
| 最近记录: |