Pytorch Dataloader中的随机数种子对训练结果的影响

问题:

最近在训练网络时遇到一个比较费解的地方:两个看似无关的setting会影响网络的训练结果,train loss 和metrics都会变。①是设置不同的num_workers,②是用不同的epoch interval在test set上进行evaluation(比如training过程中用 n n n 个epoch测一次)。

分析过程:

用的codebase是基于deitmae的finetune代码,data-augmentation用的就是timm中imagenet的augmentation。检查过了②的train loss curve到底从哪里开始出现差异的,发现就是因为中间多进行了一步evaluate过后就开始变化。但是此时的模型参数和dataloader.dataset.sampler给的index都是一样的,也就是说在这个时刻的模型和用来预备train的数据原图都是一致的,但是经过Dataloader之后的images有差异,所以就是data-augmentation不一样了。尝试关掉data-augmentation后发现上述的差异确实消失了,然后因为采用了rand-augmentation,所以猜测和random的状态有关。


关于随机数生成:随机函数的随机数种子决定了之后生成的随机数序列(RNG,random number generator),而每次调用了随机函数就会往后面一位移动。所以这个问题的本质就是evaluate在什么地方额外用了随机函数,让两个training的随机数序列错位了。


codebase里面关于随机数生成的参数有三种:torch.random, numpy.random, 还有一个python自己的 random。训练开始的时候固定了随机种子,然后打印了这三种random函数在evaluate/ without evaluate 生成的随机数,**发现evaluate前后只有torch.random的状态变化了,其他两种的状态都是对齐的。**在timm的data-augmentation里面这三种随机函数貌似都有用到:本文中用到的主要有RadomResizedInterpolartion, RandomAugmentation,还有HorizentalFlip,然而源码里面只有HorizentalFlip里面用了一个torch.rand,其他两个都只用了numpy.random或者random。按理来说这三种随机函数的随机序列是相互独立的,所以关掉这个HorizentalFlip应该就可以消除augmentation的差异了,然而试过之后发现并不行。挨个把这几个函数给关掉,发现只要有随机的东西就是不行,不管它是由哪一种random实现的。

既然这个差异是由于evaluate带来的,接下来就排查evaluate进行了哪些操作会影响到torch.random。最后发现是因为调用过Dataloader。

求助师兄和我一起看,发来了一个

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值