"Subset"和"SubsetRandomSampler"的区别



最近,我尝试用SubsetSubsetRandomSampler方法来解决K-fold交叉验证问题。

当我使用Subset方法时,CIFAR10数据集的第一历元精度为88%然而,当我使用SubsetRandomSampler方法时,CIFAR10数据集的第一历元精度仅为16%. 这真的让我很困惑,我也不知道。有人知道吗?非常感谢。

Subset方法的代码:

for fold,(trainLoader,valLoader) in enumerate(kf.split(trainSet)):
trainSetBasic = torch.utils.data.Subset(trainSet, trainLoader)
valSetBasic = torch.utils.data.Subset(trainSet, valLoader)
dataloaders = {
'train': DataLoader(trainSetBasic, batch_size=BATCH_SIZE, shuffle=True, num_workers=2),
'val': DataLoader(valSetBasic, batch_size=BATCH_SIZE, shuffle=True, num_workers=2)
}

SubsetRandomSampler方法的代码:

for fold,(trainLoader,valLoader) in enumerate(kf.split(trainSet)):
train_subsampler = torch.utils.data.SubsetRandomSampler(trainLoader)
val_subsampler = torch.utils.data.SubsetRandomSampler(valLoader)
dataloaders = {
'train': DataLoader(trainSet, batch_size=BATCH_SIZE, sampler=train_subsampler, shuffle=False, num_workers=2),
'val': DataLoader(trainSet, batch_size=BATCH_SIZE, sampler=val_subsampler, shuffle=False, num_workers=2)
}

其他部分的代码都是一样的。

在我看来,这两种代码的区别在于手动变换索引。

你的数据集是如何定义的-类是内部排序的吗?如果是,使用SubsetRandomSampler,您将只将第一个类传递给train_subsampler,并将最后一个类传递给val_subsampler。这就解释了为什么准确率这么低。

最新更新