0
点赞
收藏
分享

微信扫一扫

Pytorch中设置哪些随机数种子,才能保证实验可重复

鱼满舱 2023-06-14 阅读 90


在深度学习训练中,为什么使用同样的代码,就是和别人得到的结果不一样。
怎么样才能保证自己每次跑同一个实验得到的结果都是一样的。
这就涉及到随机数的设定,代码很短,但是很有用。
强烈建议收藏⭐️,或者把这段代码添加进pycharm活动模板即可快速使用~~~~~。

1. 就这几句话👇

import numpy as np
import torch
import random
import os

seed_value = 2020   # 设定随机数种子

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

torch.manual_seed(seed_value)     # 为CPU设置随机种子
torch.cuda.manual_seed(seed_value)      # 为当前GPU设置随机种子(只用一块GPU)
torch.cuda.manual_seed_all(seed_value)   # 为所有GPU设置随机种子(多块GPU)

torch.backends.cudnn.deterministic = True

以上代码放在所有使用随机数前就行。我习惯性放在import之后,在做事情前先把随机数设定好,比较安全。
关于随机数的值设定成多少,好像也没有特别讨论过,都是随便设定。如果有知道的也欢迎告诉我,谢谢😋

下面进行简单地分析。愿意多看一点的继续,忙的直接粘贴复制上面代码即可。

上述代码的随机数主要是三个方面的设定。

1. python 和 numpy 随机数的设定

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

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

2. pytorch 中随机数的设定

torch.manual_seed(seed_value)     # 为CPU设置随机种子
torch.cuda.manual_seed(seed_value)      # 为当前GPU设置随机种子(只用一块GPU)
torch.cuda.manual_seed_all(seed_value)   # 为所有GPU设置随机种子(多块GPU)

pytorch中,会对模型的权重等进行初始化,因此也要设定随机数种子

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

torch.backends.cudnn.deterministic = True

另外,也有人提到说dataloder中,可能由于读取顺序不同,也会造成结果的差异。这主要是由于dataloader采用了多线程(num_workers > 1)。目前暂时没有发现解决这个问题的方法,但是只要固定num_workers数目(线程数)不变,基本上也能够重复实验结果。

2.为代码添加活动模板

这么长的代码,每次都要敲一遍,或者粘贴复制也很麻烦。因此,可以在pycharm里面设定一个模板,就可以快捷输入了。大致过程如下:

Pytorch中设置哪些随机数种子,才能保证实验可重复_随机数


想要细节描述的可以百度 pycharm 活动模板的设定。

当我要使用这段代码的时候,敲自己定义的快捷字符串就可以了

Pytorch中设置哪些随机数种子,才能保证实验可重复_随机数_02

3 MONAI框架随机数设定

Monai 对随机数的设定,一行代码就搞定了

from monai.utils import set_determinism
set_determinism(seed=0)

和pytorch中使用方法是一样的,这个函数就是已经设定好了各种各样的随机数。使用起来更方便。亲测有用。

会经常分享经典论文的理解和复现。说的再多,会动手才是硬道理。关注我,一起学习,一起成长。

Pytorch中设置哪些随机数种子,才能保证实验可重复_随机化_03


举报

相关推荐

0 条评论