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

 更新时间:2020年02月20日 16:35:01   作者:hyk_1996  
今天小编就为大家分享一篇浅谈PyTorch的可重复性问题(如何使实验结果可复现),具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧

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

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

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

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 装饰器的使用示例

    这篇文章主要介绍了python 装饰器的使用示例,帮助大家更好的理解和使用python装饰器,感兴趣的朋友可以了解下
    2020-10-10
  • 利用python绘制蜂群图的示例代码

    利用python绘制蜂群图的示例代码

    蜂群图可以不重叠的显示各数据点的分布,相对于散点图,所绘制的点彼此靠近且不会重叠,能有效呈现出点分布的局部密度信息,本文给大家介绍了如何利用python绘制蜂群图,文中有详细的代码示例供大家参考,需要的朋友可以参考下
    2024-03-03
  • Python利用BeautifulSoup解析网页内容

    Python利用BeautifulSoup解析网页内容

    当今信息爆炸的时代,网络上充斥着海量的数据,而网络爬虫作为一种数据采集工具,扮演着至关重要的角色,BeautifulSoup 是一个Python库,它可以从HTML或XML文件中提取数据,本文介绍了Python如何利用BeautifulSoup解析网页内容,需要的朋友可以参考下
    2024-06-06
  • Python word2vec训练词向量实例分析讲解

    Python word2vec训练词向量实例分析讲解

    这篇文章主要介绍了Python word2vec训练词向量实例分析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2022-12-12
  • Python中type()函数的具体使用

    Python中type()函数的具体使用

    在Python中,type()函数是一个非常有用的工具,它可以查看变量或对象的数据类型,本文主要介绍了Python中type()函数的具体使用,感兴趣的可以一起来了解一下
    2024-01-01
  • Pandas实现数据类型转换的一些小技巧汇总

    Pandas实现数据类型转换的一些小技巧汇总

    这篇文章主要给大家汇总介绍了关于Pandas实现数据类型转换的一些小技巧,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-05-05
  • Tensorflow的可视化工具Tensorboard的初步使用详解

    Tensorflow的可视化工具Tensorboard的初步使用详解

    这篇文章主要介绍了Tensorflow的可视化工具Tensorboard的初步使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-02-02
  • 详解pandas.DataFrame.plot() 画图函数

    详解pandas.DataFrame.plot() 画图函数

    这篇文章主要介绍了详解pandas.DataFrame.plot()画图函数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • 已解决不小心卸载pip后怎么处理(重新安装pip的两种方式)

    已解决不小心卸载pip后怎么处理(重新安装pip的两种方式)

    这篇文章主要介绍了已解决不小心卸载pip后怎么处理(重新安装pip的两种方式),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • windows下安装Python的XlsxWriter模块方法

    windows下安装Python的XlsxWriter模块方法

    今天小编就为大家分享一篇windows下安装Python的XlsxWriter模块方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-05-05

最新评论