Cross validation 的结果非常差,趋近于 0(数据处理的坑)

起因于合并 train 和 valid 文件夹下的文件用以重新划分训练/验证集

如果你将train文件夹和valid文件夹下的内容合并成一个新的文件夹(为了做 cross validation),那么在做 K-fold 的时候,序号一定要 shuffle 去打乱,你只要默认打乱了,就不需要考虑太多,否则就会出现一种情况:验证集的 label 有可能在训练集中不存在,那就意味着,你的模型可能几乎没见过验证集里面的 label,如果完全没见过,那 acc 甚至有可能是 0。下面是我当时疏忽导致的 bug:

这个错误完全是因为我在 Dataloader 中使用了shuffle=True,然后偷懒不打乱 (shuffle) 索引导致的,第一次运行的时候,甚至跑出了 acc=0。

下面是我代码中 Dataset 的简化版本,希望能帮助你更好的理解和定位问题:

class Dataset(Dataset):

    def __init__(self,path):
        super(FoodDataset).__init__()
        self.path = path
        self.files = sorted([os.path.join(path,x) for x in os.listdir(path) if x.endswith(".jpg")])
  
    def __len__(self):
        return len(self.files)
  
    def __getitem__(self,idx):
        fname = self.files[idx]
        im = Image.open(fname)
        
        try:
            label = int(fname.split("/")[-1].split("_")[0])
        except:
            label = -1 # test has no label
            
        return im,label

数据集命名格式:label_index.jpg

Dataset 中, sorted 将文件按顺序排列,这导致了一个问题,那就是不同的 label 也是按顺序的,如果索引时不打乱(shuffle),就会出现上面所说的问题。

下面是取 label 的代码演示:

print(int('./merge/1_0001'.split("/")[-1].split("_")[0]))
>> 1
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hoper.J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值