Pytorch 的 DataLoader 中的 shuffer = True 时随机种子的设置

这两天在用Pytorch写模型训练的时候突然发现,本该是一模一样的两个网络的输出结果却不同,仔细排查后发现问题出在了 torch.DataLoader() 这个函数上,更具体的,出在这个函数的 shuffer 参数上。当设置 shuffer = True 时,即使所有设定都一样,dataloader产生的数据batch的内容在两份代码中是不同的。

上网一搜,发现这个问题很多人遇到了,也给出了一些解决办法,比如普遍的固定全局随机种子

if args.seed is not None:      
	random.seed(args.seed) 
	torch.manual_seed(args.seed)  #为CPU设置种子用于生成随机数,以使得结果是确定的      
	torch.cuda.manual_seed(args.seed) #为当前GPU设置随机种子; 
	torch.backends.cudnn.deterministic = True

当然,这种随机种子的设置一开始我就有固定,所以问题压根不在设置全局随机种子上,而是 DataLoader() 函数本身的随机种子不受全局随机种子的影响,即使设置了全局随机种子,DataLoader() 函数的 shuffer 还是会用自己的随机种子来打乱顺序。

解决方法:

道理很简单,既然DataLoader() 函数的 shuffer 有自己的随机种子,那就固定住 DataLoader() 的随机种子即可:

DataLoader(dataset, batch_size=batch_size, shuffle=True, generator=torch.Generator().manual_seed(SEED))

shuffer = True 时,将 DataLoader() 的 generator 参数使用 torch.Generator().manual_seed(SEED) 来固定随机种子,这样就可以实现 DataLoader() 打乱后的数据顺序是一致的了!
参考:https://pythonjishu.com/ihltcmrubugviyd/

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值