转载请注明作者和出处: http://blog.csdn.net/john_bh/

文章目录

  • 1. 训练过程
  • 2. 测试过程
  • 3. 代码随机种子的设定
  • 4. 参考链接

在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果。当得到比较好的结果时我们通常希望这个结果是可以复现的,在PyTorch中,通过设置全局随机数种子可以实现这个目的。本文总结了PyTorch中固定随机种子的方法。

1. 训练过程

在训练过程中,若相同的数据数据集,相同的训练集、测试集划分方式,相同的权重初始化,但是每次训练结果不同,可能有以下几个原因:

  • Dropout的存在 ;
  • PyTorch、Python、Numpy中的随机种子没有固定;
  • 数据预处理、增强方式采用了概率,若没有设置固定的随机种子,结果可能不同。例如常用数据增强库albumentations就采用了Python的随机产生器;
  • 训练数据集被随机打乱了顺序;
  • 向上采样和插值函数/类的向后是不确定的(PyTorch的问题)

举个例子:

import numpy as npdef  no_set_seed():n = 0while (n < 3):n += 1print(np.random.random())def set_seed():n = 0while (n < 3):np.random.seed(5)n += 1print(np.random.random())if __name__=="__main__":print(" ***** no set seed result *****  ")no_set_seed()print(" ***** set seed result ***** ")set_seed()

输出:

***** no set seed result *****
0.7831834888867475
0.919347615336164
0.9437836768670717
***** set seed result *****
0.22199317108973948
0.22199317108973948
0.22199317108973948

当我们设定一个随机种子时,那么关于随机数的选取就确定了。

另外,在PyTorch官方文档中说明了在Pytorch的不同提交、不同版本和不同平台上,不能保证完全可重现的结果。此外,即使使用相同的种子,因为存在不同的CPU和GPU,结果也不能重现。

但是对于一个特定的平台和PyTorch发行版上对您的特定问题进行确定性的计算,需要采取几个步骤。在can’t reproduce results even set all random seeds给出了解决方式。

其中包括:

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

    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True
    

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

  • 对PyTorch设置随机种子;
  • 对Python & NumPy设置随机种子:如果读取数据的过程采用了随机预处理(如RandomCrop、RandomHorizontalFlip等),那么对python、numpy的随机数生成器也需要设置种子;
  • 对dataloader设置随机种子:如果dataloader采用了多线程(num_workers > 1), 那么由于读取数据的顺序不同,最终运行结果也会有差异。也就是说,改变num_workers参数,也会对实验结果产生影响。目前暂时没有发现解决这个问题的方法,但是只要固定num_workers数目(线程数)不变,基本上也能够重复实验结果。对于不同线程的随机数种子设置,主要通过DataLoaderworker_init_fn参数来实现。默认情况下使用线程ID作为随机数种子。
  1. 参考can’t reproduce results even set all random seeds#7068(comment1),建议采用下面方式解决:在运行任何程序之前写入下面代码(可以放在主代码的开头,在导入模块之后):

    torch.manual_seed(seed) # 为CPU设置随机种子
    torch.cuda.manual_seed(seed) # 为当前GPU设置随机种子
    torch.cuda.manual_seed_all(seed)  # if you are using multi-GPU,为所有GPU设置随机种子
    np.random.seed(seed)  # Numpy module.
    random.seed(seed)  # Python random module.
    torch.backends.cudnn.benchmark = False
    torch.backends.cudnn.deterministic = True
    

    将它封装一个函数,参考can’t reproduce results even set all random seeds#7068 (comment2),代码如下:

    def seed_torch(seed=1029):random.seed(seed)os.environ['PYTHONHASHSEED'] = str(seed) # 为了禁止hash随机化,使得实验可复现np.random.seed(seed)torch.manual_seed(seed)torch.cuda.manual_seed(seed)torch.cuda.manual_seed_all(seed) # if you are using multi-GPU.torch.backends.cudnn.benchmark = Falsetorch.backends.cudnn.deterministic = Trueseed_torch()
    
  2. 在PyTorch的DataLoader函数中填入为不同的work设置初始化函数,确保您的dataloader在每次调用时都以相同的顺序加载样本(随机种子固定时)。如果进行裁剪或其他预处理步骤,请确保它们是确定性的。(这样的模块可以提供确定性结果(在Pytorch 1.0.0甚至在此版本之前))
    def _init_fn(worker_id):np.random.seed(int(seed)+worker_id)
    trainloader = DataLoader(trainset, batch_size=batch_size, shuffle=True, num_workers=num_workers, pin_memory=True, worker_init_fn=_init_fn)
    
  3. 向上采样和插值函数/类的向后是不确定的(BACKWARD of upsampling and interpolation functionals/classes is non-deterministic)。这意味着,如果你在训练图中使用这样的模块,无论你做什么,都永远不会得到确定性的结果。torch.nn.ConvTranspose2d函数是不确定的,除非你使用torch.backends.cudnn.deterministic = True(原文中说you can try to make the operation deterministic … by setting torch.backends.cudnn.deterministic = True,所以这样做是否能够得到正确结果也是待定的)。

2. 测试过程

在测试过程中,相同的权重,相同的测试数据集,结果不同,可能有以下几个原因:

  • 未设定eval()模式,因为模型中的Dropout和Batchnorm存在,导致结果不固定;
  • PyTorch、Python、Numpy中的随机种子没有固定,可能运行时依赖的一些第三方库;
  • 有随机性 数据预处理方式中含有概率;
  • 向上采样和插值函数/类的向后是不确定的(Pytorch的问题)

随机种子的设定和训练中的设置类似,可参考第一节内容。

3. 代码随机种子的设定

有的时候,不同的随机种子对应的神经网络结果不同,我们并不想固定随机种子,使其能够搜索最优结果。但是又想能够根据复现最优结果,所以我们需要每次运行代码都根据当前时间设定不同的随机种子,并将随机种子保存下来。

可以使用下面代码产生随机种子,用于固定Pytorch、Python、Numpy中的随机种子,你可以将这个值保存到特定的文件中,用于之后使用。

seed = int(time.time() * 256)

4. 参考链接

  1. Pytorch随机种子
  2. 数据增强库albumentations
  3. Python的随机产生器
  4. can’t reproduce results even set all random seeds
  5. can’t reproduce results even set all random seeds#7068(comment1)
  6. can’t reproduce results even set all random seeds#7068 (comment2)

PyTorch固定随机数种子相关推荐

  1. Pytorch固定随机种子复现模型

    官网 Reproducibility - PyTorch 1.11.0 documentation 在神经网络中,参数默认是进行随机初始化的.不同的初始化参数往往会导致模型的训练结果会存在一定的差异. ...

  2. Pytorch固定随机性

    import random import torch import numpy as np def set_random_seed(seed=42):torch.manual_seed(seed)#t ...

  3. python random.seed()函数 (生成固定随机数)random.seed(None)(取消固定随机数种子)

    我们调用 random.random() 生成随机数时,每一次生成的数都是随机的. 但是,当我们预先使用 random.seed(x) 设定好种子之后,其中的 x 可以是任意数字,如10,这个时候,先 ...

  4. pytorch 可复现性

    官网说明:                  Reproducibility - PyTorch 1.8.0 documentation 参考博客:                   PyTorch ...

  5. 深度学习中的随机数种子

    深度学习中的随机数种子 seed()函数的作用 解释 例子1 例子2 深度学习中的随机数种子 训练过程 测试过程 代码随机种子的设定 本文参考网络上对于seed函数的讲解,记录一下我对于这个函数作用的 ...

  6. python随机数种子怎么用_Python 随机种子介绍,PyTorch 中随机种子的设置应用

    随机种子是什么? 随机种子是针对 随机方法 而言的. 随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是基于生成随机数来实现的.在深度学习中,比较常用的随机方法的应 ...

  7. Pytorch为什么总要设置随机种子

    Pytorch为什么总要设置随机种子 在pytorch中总能看到以 第一行有个设置随机种子的函数?它到底有啥作用? def set_seed(seed=1):random.seed(seed)np.r ...

  8. PyTorch单机多卡训练(DDP-DistributedDataParallel的使用)备忘记录

    不做具体的原理分析和介绍(因为我也不咋懂),针对我实际修改可用的一个用法介绍,主要是模型训练入口主函数(main_multi_gpu.py)的四处修改. 以上的介绍来源https://zhuanlan ...

  9. 彩色星球图片生成1:使用Gan实现(pytorch版)

    彩色星球图片生成1:使用Gan实现(pytorch版) 1. 描述 2. 代码 2.1 模型代码model.py 2.2 训练代码main.py 3. 效果 4. 趣图 上一集: 使用Gan实现MNI ...

  10. Python 随机种子介绍,PyTorch 中随机种子的设置与应用

    什么是随机种子? 随机种子是针对 随机方法 而言的. 随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是 基于生成随机数来实现的.在深度学习中,比较常用的随机方法的 ...

最新文章

  1. 别再蒸馏3层BERT了!变矮又能变瘦的DynaBERT了解一下
  2. discuz 的 group.php,DiscuzX用户组过期问题解决方法
  3. 优麒麟在linux下安装教程,在优麒麟Ubuntu Kylin系统中安装百度网盘Linux版.deb的方法...
  4. 外卖和快递行业数据_抢人大战愈演愈烈,东莞再现用工荒!不只流向外卖、快递等行业...
  5. docker pytorch
  6. three.js 笑脸雨
  7. 《Ray Tracing in One Weekend》——Chapter 7: Diffuse materials
  8. BootStarp的form表单的基本写法
  9. 三维视觉和三维点云基础概念
  10. easyexcel一个单元格导出多张图片等
  11. 搜狐季报图解:营收1.93亿美元 盈利900万美元
  12. CSAPP : Arch Lab 解题报告
  13. 安装vue脚手架出现的问题 npm ERR! code EEXIST。。。
  14. ubuntu折腾笔记【三】
  15. 推广都需要哪些工具?这几款工具可以轻松提高推广效率
  16. 学校计算机工作室制度,邵鹏飞计算机工作室2019-2020学年工作计划
  17. 【开源电机驱动】电机建模
  18. 烟台职称计算机考试时间,2015年烟台职称计算机考试报名时间和有关事项通知...
  19. Who moved my cheese?
  20. java 拼音首字母搜索内容功能详解

热门文章

  1. 使用switchhost进行host文件管理
  2. 算法第四版- 4.3
  3. Camel可视化操作(结合Gooflow)
  4. 10分钟教你写个商业计划书
  5. 计算机印屏幕功能无法使用,计算机电脑管家多屏协同功能无法使用
  6. 多张pdf怎么合成一张?pdf快速合并法
  7. python 定时任务框架APScheduler
  8. 29 岁成为阿里巴巴 P8,工作前 5 年完成晋升 3 连跳,他如何做到?
  9. SQL的几种连接查询方式(内连接、外连接、全连接、联合查询)
  10. matlab sfp,eeglab工具箱