添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在深度学习训练中,为什么使用同样的代码,就是和别人得到的结果不一样。
怎么样才能保证自己每次跑同一个实验得到的结果都是一样的。
这就涉及到随机数的设定,代码很短,但是很有用。
强烈建议收藏⭐️,或者把这段代码添加进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里面设定一个模板,就可以快捷输入了。大致过程如下:

在这里插入图片描述
想要细节描述的可以百度 pycharm 活动模板的设定。
当我要使用这段代码的时候,敲自己定义的快捷字符串就可以了
在这里插入图片描述

3 MONAI框架随机数设定

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

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

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

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

在深度学习训练中,为什么使用同样的代码,就是和别人得到的结果不一样。怎么样才能保证自己每次跑同一个实验得到的结果都是一样的。这就涉及到随机数的设定,代码很短,但是很有用。强烈建议收藏⭐️,或者把这段代码添加进pycharm活动模板即可快速使用~~~~~。1. 就这几句话????import numpy as npimport torchimport randomimport osseed_value = 2020 # 设定随机数种子np.random.seed(seed_valu
由于在模型训练的过程存在大量的随机操作,使得对于同一份代码,重复运行后得到的结果不一致。因此,为了得到可重复实验结果,我们需要对随机数生成器设置一个固定的种子。 许多博客都有介绍如何解决这个问题,但是很多都不够全面,往往不能保证结果精确一致。我经过许多调研和实验,总结了以下方法,记录下来。 全部设置可以分为三部分: 1. CUDNN cudnn对卷积操作进行了优化,牺牲了精度来...
**前言:**最近在构建网络的时候,有一些层参数一样,于是就没有定义新的层,直接重复使用了原来已经有的层,发现效果和模型大小都没有什么变化,心产生了疑问:定义的网络结构层能否重复使用?因此接下来利用了一个小模型网络实验了一下。
在深度学习,处理数据和对模型进行参数初始赋值通常有许多随机性的操作,为了使在同一台设备能可重复实验,可以提前在以下几个方面进行设置保证初始的随机种子(seed)相等。 1、Pytorch 通过torch.manual_seed()来为CPU和CUDA设置其初始的seed import torch torch.manual_seed(0) 2、CuDNN 当代码运行在CuDNN的后端,需要执行以下两步操作: torch.backends.cudnn.deterministic = True torch.manual_seed(init_seed) torch.cuda.manual_seed(init_seed) np.random.seed(init_seed) # 用于numpy的随机数 torch.manual_seed(seed) 为了生成随机数设置种子。返回一个torch.Generator对象 seed (int) – 期望的种子数 torch.cuda.manual_seed(seed) 为当前GPU生成随机数设置种子。如果CUDA不可用,调用该
在科学技术和机器学习等其他算法相关任务,我们经常需要用到随机数,为了把握随机数的生成特性,从随机数的随机无序获得确定和秩序。我们可以利用随机数种子(random seed)来实现这 一目标,随机数种子,可以使得引入了随机数的整个程序,在多次运行得到确定的,一致的结果。 1. 随机数种子 python自带的random函数: import random # print(help(random)) def test_random_seed_in_std_lib(seed=0, cnt...
问题背景是这样的: 我用了自己定义了pytorch的模型,并且,在main函数设置了随机种子用来保证模型初始化的参数是一致的,同时pytorch的随机种子也能够影响dropout的作用,见链接 为了保证所有的参数都一样,我在设置dataloader的时候,数据并没有进行shuffle,这样能够在每一个iteration的时候,没有random的操作 但是,一旦我把模型放到GPU上运行之...
1. AlexNet:一个经典的卷积神经网络模型。 2. VGG:一系列深度卷积神经网络模型,具有不同的层数和参数量。 3. ResNet:使用残差块来解决深度网络训练的梯度消失问题。 4. Inception:使用多个不同大小的卷积核和池化核来提取特征。 5. DenseNet:使用密集连接来提高特征传递效率。 6. MobileNet:专门设计用于移动设备的轻量级模型。 7. U-Net:用于图像分割任务的编码-解码结构。 8. GAN(生成对抗网络):包括GAN、DCGAN、CycleGAN等,用于生成新的数据样本。 除了这些,还有许多其他模型可供选择。您可以使用`torchvision.models`模块来加载这些预训练模型。