最近,我尝试用Subset
和SubsetRandomSampler
方法来解决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
。这就解释了为什么准确率这么低。