我通过使用Alexnet作为预训练模型并更改了最终输出层,实现了图像分类网络以对100个类别的数据集进行分类。 我在加载数据时注意到了
trainloader = torch.utils.data.DataLoader(train_data, batch_size=32, shuffle=False)
,在大约10个时间段内,我在验证数据集上的准确度约为2-3%,但是当我刚刚更改shuffle=True
并重新训练了网络时,在第一个时间段本身中,准确度就跃升到70%。
我想知道是否会发生这种情况,因为在第一种情况下,仅在少数情况下一个类一次连续显示一个网络,一个例子又一个例子,导致网络在训练过程中泛化能力差,或者背后是否还有其他原因? / p>
但是,我没想到会有如此大的影响。
P.S:两种情况下,所有代码和参数都完全相同,只是更改了shuffle选项。
答案 0 :(得分:3)
是的,完全可以影响结果!改组我们用于分类器的数据的顺序非常重要,因为历元之间的批次看起来并不相同。
检查Data Loader Documentation时显示: “随机播放(布尔型,可选)–设置为True,以便在每个时期都对数据进行随机播放”
无论如何,它将使模型更加健壮,并避免过度/不足。
在您的情况下,准确性的大幅提高(由于对数据集缺乏了解)可能是由于数据集的“组织方式”所致,例如,每个类别分别属于不同的批次,并且在每个类别中时代开始,批次包含相同的类别,因此在进行测试时得出的准确性非常差。
答案 1 :(得分:3)
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
。
这可以改善学习过程。