原理

在神经网络中,参数默认是进行随机初始化的。不同的初始化参数往往会导致不同的结果。

当得到比较好的结果时我们通常希望这个结果是可以复现的,在pytorch中,通过设置全局随机数种子可以实现这个目的。

具体操作

对随机数生成器设置固定种子的操作可以分为四部分。

1. cuDNN

cudnn中对卷积操作进行了优化,牺牲了精度来换取计算效率。

如果需要保证可重复性,可以使用如下设置:

from torch.backends import cudnn

cudnn.benchmark = False # if benchmark=True, deterministic will be False

cudnn.deterministic = True

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

2. PyTorch

seed = 0

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 os

import random

import numpy as np

seed = 0

random.seed(seed)

np.random.seed(seed)

os.environ['PYTHONHASHSEED'] = str(seed) # 为了禁止hash随机化,使得实验可复现。

4. 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)

参考

python怎么设置随机数种子_PyTorch设置随机数种子使结果可复现相关推荐

  1. pro调用python libs_使用WingPro 7 设置Python路径的方法

    Python使用称为Python Path的搜索路径来查找使用import语句导入代码的模块.大多数代码只会汇入已经默认路径上的模块,通过安装到Python的Python标准库的例子模块或模块点子,p ...

  2. 【Python】Pandas 表格样式设置指南,看这一篇就够了!

    Pandas 表格样式设置指南 来源:Python数据之道 (ID:PyDataLab) 作者:阳哥 最近这些年,Python在数据分析以及人工智能领域是越来越火. 这离不开pandas.numpy. ...

  3. python使用matplotlib可视化:设置坐标轴的范围、设置主次坐标轴刻度、坐标轴刻度显示样式、坐标轴刻度数颜色、小数点位数、坐标轴刻度网格线、线条类型、数据点形状标签、文本字体、颜色、大小等

    python使用matplotlib可视化:设置坐标轴的范围.设置主次坐标轴刻度.坐标轴刻度显示样式.坐标轴刻度数颜色.小数点位数.坐标轴刻度网格线.线条类型.数据点形状标签.文本字体.颜色.大小等 ...

  4. Python命令行补全设置

    Python的启动文件的设置,当按下tab键时会有自动补全功能,在用户家目录里 新建python的启动文件,如.pythonstartup,文件内容如下: 1 2 3 4 5 6 7 8 9 10 1 ...

  5. Python开发工具PyCharm个性化设置备份

    官方下载地址:http://www.jetbrains.com/pycharm/download/ PyCharm个性化设置备份 1.设置默认PyCharm解析器:参考[启动PyCharm,提示No ...

  6. 【Python】写文件个性化设置模块Python_Xlwt练习

    python:写文件个性化设置模块Python_Xlwt练习 # -*- coding: utf-8 -*- """ Created on Sun Aug 5 22:52 ...

  7. python代码编码成jni_python 设置文件编码格式的实现方法

    如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码.(python3已经没有这个问题了,python3默认的文件编码是UTF-8 ...

  8. Python编程之文本颜色设置

    问题描述:使用Python语言完成文本颜色设置. 源代码: #!/usr/bin/python # -*- coding: UTF-8 -*-class bcolors:HEADER = '\033[ ...

  9. python文件开头第一行设置utf-8编码

    python文件开头第一行设置utf-8编码 若不添加,文件中涉及到中文,执行会报错如下: SyntaxError: Non-ASCII character '\xe5' in file /Users ...

最新文章

  1. Java学习_day002:变量
  2. Nmap/Netcat/Hping3工具对比
  3. openresty开发系列14--lua基础语法3函数
  4. 知乎启动首部科幻剧《寒梅工程2021》 概念片首次曝光
  5. mysql 怎么导入sql文件_如何在MySQL中使用命令行导入SQL文件?
  6. 司空见惯 - 会议室名称
  7. 序列选项设置html,clustalx序列比对步骤
  8. 【黑灰产犯罪研究】恶意点击
  9. 树莓派4B安装桌面控件wbar和conky,美化桌面(解决报错)
  10. aruba交换机配置命令_aruba配置手册
  11. 创业失败的18个原因
  12. (附代码)基于Python对交通路口的红绿灯进行颜色检测
  13. ibm邮件怎么撤回_请问LotusNotes具备发出邮件后撤回 – 手机爱问
  14. OpenCV python 轮廓的极值点
  15. 蚂蚁金服开发文档中心
  16. ESP8266 AT指令设置及51单片机的控制
  17. 新电脑小喇叭一直是红❌的解决方法
  18. 计算机科学投稿须知,《计算机科学》投稿须知
  19. ISO七层模型和TCP/IP四层模型
  20. 126. 单词接龙 II

热门文章

  1. 【SCP命令】Linux和Windows下的文件互传
  2. 字帖287 董其昌 行书《采莲曲乌夜啼》
  3. P3887 [GDOI2014]世界杯
  4. php获取 url 井号,php获取url井号后的参数(描点#后参数)
  5. 网件交换机基本配置命令集合
  6. python3.7.1安装scipy_CENTOS7 Python3.7安装 scipy
  7. 华为 nexus 6P手机 Google Android Beta 8.0 系统Root
  8. 文字内容自动生成PPT
  9. android清除WebView使用的缓存的学习记录
  10. iPad Air 2全然评測:可怕的三核CPU、六核GPU