浅谈PyTorch的可重复性问题(如何使实验结果可复现)


Posted in Python onFebruary 20, 2020

由于在模型训练的过程中存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复的实验结果,我们需要对随机数生成器设置一个固定的种子。

许多博客都有介绍如何解决这个问题,但是很多都不够全面,往往不能保证结果精确一致。我经过许多调研和实验,总结了以下方法,记录下来。

全部设置可以分为三部分:

1. CUDNN

cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。如果需要保证可重复性,可以使用如下设置:

from torch.backends import cudnn
cudnn.benchmark = False      # if benchmark=True, deterministic will be False
cudnn.deterministic = True

不过实际上这个设置对精度影响不大,仅仅是小数点后几位的差别。所以如果不是对精度要求极高,其实不太建议修改,因为会使计算效率降低。

2. Pytorch

torch.manual_seed(seed)      # 为CPU设置随机种子
torch.cuda.manual_seed(seed)    # 为当前GPU设置随机种子
torch.cuda.manual_seed_all(seed)  # 为所有GPU设置随机种子

3. Python & Numpy

如果读取数据的过程采用了随机预处理(如RandomCrop、RandomHorizontalFlip等),那么对python、numpy的随机数生成器也需要设置种子。

import random
import numpy as np
random.seed(seed)
np.random.seed(seed)

最后,关于dataloader:

注意,如果dataloader采用了多线程(num_workers > 1), 那么由于读取数据的顺序不同,最终运行结果也会有差异。也就是说,改变num_workers参数,也会对实验结果产生影响。目前暂时没有发现解决这个问题的方法,但是只要固定num_workers数目(线程数)不变,基本上也能够重复实验结果。

对于不同线程的随机数种子设置,主要通过DataLoader的worker_init_fn参数来实现。默认情况下使用线程ID作为随机数种子。如果需要自己设定,可以参考以下代码:

GLOBAL_SEED = 1
 
def set_seed(seed):
  random.seed(seed)
  np.random.seed(seed)
  torch.manual_seed(seed)
  torch.cuda.manual_seed(seed)
  torch.cuda.manual_seed_all(seed)
 
GLOBAL_WORKER_ID = None
def worker_init_fn(worker_id):
  global GLOBAL_WORKER_ID
  GLOBAL_WORKER_ID = worker_id
  set_seed(GLOBAL_SEED + worker_id)
 
dataloader = DataLoader(dataset, batch_size=16, shuffle=True, num_workers=2, worker_init_fn=worker_init_fn)

以上这篇浅谈PyTorch的可重复性问题(如何使实验结果可复现)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python基于mysql实现的简单队列以及跨进程锁实例详解
Jul 07 Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 Python
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
May 15 Python
python获取指定字符串中重复模式最高的字符串方法
Jun 29 Python
对python 生成拼接xml报文的示例详解
Dec 28 Python
Python3利用print输出带颜色的彩色字体示例代码
Apr 08 Python
我就是这样学习Python中的列表
Jun 02 Python
详解python tkinter模块安装过程
Jan 06 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
pyecharts在数据可视化中的应用详解
Jun 08 Python
PyCharm设置注释字体颜色以及是否倾斜的操作
Sep 16 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
pytorch 模型的train模式与eval模式实例
Feb 20 #Python
pytorch dataloader 取batch_size时候出现bug的解决方式
Feb 20 #Python
pytorch 使用加载训练好的模型做inference
Feb 20 #Python
pytorch中的inference使用实例
Feb 20 #Python
python encrypt 实现AES加密的实例详解
Feb 20 #Python
Python关于反射的实例代码分享
Feb 20 #Python
Python3监控疫情的完整代码
Feb 20 #Python
You might like
菜鸟修复电子管记
2021/03/02 无线电
php利用cookies实现购物车的方法
2014/12/10 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
基于PHP实现等比压缩图片大小
2016/03/04 PHP
php 使用curl模拟登录人人(校内)网的简单实例
2016/06/06 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
如何实现浏览器上的右键菜单
2006/07/10 Javascript
浅谈JavaScript编程语言的编码规范
2011/10/21 Javascript
jQuery-ui引入后Vs2008的无智能提示问题解决方法
2014/02/10 Javascript
AngularJS入门教程之学习环境搭建
2014/12/06 Javascript
js表单中选择框值的获取及表单的序列化
2015/12/17 Javascript
js实现简单的网页换肤效果
2017/01/18 Javascript
javascript容错处理代码(屏蔽js错误)
2017/01/20 Javascript
详解Vue使用 vue-cli 搭建项目
2017/04/20 Javascript
详解AngularJS2 Http服务
2017/06/26 Javascript
JavaScript利用fetch实现异步请求的方法实例
2017/07/26 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
python检查URL是否正常访问的小技巧
2017/02/25 Python
python虚拟环境virtualenv的安装与使用
2017/09/21 Python
python脚本作为Windows服务启动代码详解
2018/02/11 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
matplotlib相关系统目录获取方式小结
2021/02/03 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
销售行业个人求职自荐信
2013/09/25 职场文书
校长岗位职责
2013/11/26 职场文书
初中班主任经验交流材料
2014/05/16 职场文书
机械工程师岗位职责
2014/06/16 职场文书
新教师培训心得体会
2014/09/02 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
幼儿园大班教师个人工作总结
2015/02/05 职场文书
导游词300字
2015/02/13 职场文书
法院执行局工作总结
2015/08/11 职场文书
党员公开承诺书2016
2016/03/24 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
golang 生成对应的数据表struct定义操作
2021/04/28 Golang