深度学习中的随机数种子

深度学习训练中的种子设置 深度学习模型训练中的种子设置 阅读详情


本文参考网络上对于seed函数的讲解,记录一下我对于这个函数作用的理解。

seed()函数的作用

解释

官方解释:

1 seed() 用于指定随机数生成时所用算法开始的整数值,如果使用相同的seed()值,则每次生成的随机数都相同。
2 设置随机数种子不设置的话按系统根据时间作为参数 设置后可以保证我们每一个产生的随机数是一样的

什么意思?这里先来了解一下随机数的背景,随机数就是随机产生的数,既然叫做随机数,那么应当具有随机性,如果随机种子能固定随机数,那么“随机数”的说法是否是个悖论。这里就要引入一个“伪随机数”的概念。在机器控制的算法或过程中,所产生的都是伪随机数,是通过一定规律产生的,也就是过程可控的。这种规律叫做随机数生成器,但是规律很复杂,就像一个黑盒,我们可以近似地将其视为随机数的模拟。随机种子就可以认为是在机器模拟过程中固定随机数产生过程的船锚。

随机数生成器:早期使用的线性同余产生器、经典斐波那契产生器和反馈移位寄存器产生器;上世纪八九十年代发展的非线性同余产生器,多步线性递推产生器,以及进位借位运算产生器;目前常用的组合产生器(前述都属于单一随机数产生器)等等。具体会涉及到密码学以及信息安全的知识。

我们可以将产生随机数的过程视为一个固定的黑盒,把设定好的种子扔进去,黑盒将会返回所想要的随机数,以及保证生成下一个随机数的新的种子,再将这颗种子继续丢进黑盒,循环迭代,从而进入随机数生成的无限循环。因此,只要初始随机种子不改变,我们将会得到固定的随机数序列。
这里的随机数种子其实没什么实际的含义,相当于某个伪随机数序列的id,只要保证种子值相同,那么就会相同的随机种子下生成相同的随机数序列,如果seed()不设置任何值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同。
根据上面的理解,我们来实验一下,这里以numpy的随机数种子为例:

例子1

import numpy as np
np.random.seed(5)
print(np.random.random())
print(np.random.random())
print(np.random.random())
print(np.random.random())

产生的结果是:

0.22199317108973948
0.8707323061773764
0.20671915533942642
0.9186109079379216

只要我设置了随机数种子为5,那么我下次再运行这个脚本,产生的结果会和上面一模一样,
看官不妨自己试一试。
此外,如果在代码中,多次设置随机数种子,那么后续再产生随时数序列时,就会从最近设置的随机数种子开始重新输出,比如:

例子2

np.random.seed(5)
print(np.random.random())
print(np.random.random())
np.random.seed(5)
print(np.random.random())
print(np.random.random())

产生的结果是:

0.22199317108973948
0.8707323061773764
0.22199317108973948
0.8707323061773764

深度学习中的随机数种子

随机种子和神经网络训练没有直接关系,随机种子的作用就是产生权重为初始条件的随机数。神经网络效果的好坏直接取决于学习率和迭代次数。
此外,最优随机种子不应去找,随机性的存在正好用来评估模型的鲁棒性。一个优秀的模型,不会因为随机初始的位置略微不同,而找不到最优的位置。这是模型本身应该要化解的工作,而不是人为选择一个随机数,之所以要设置随机数种子,一方面是为了在得到比较好的结果时可以复现这个结果,另一方面,每次随机的初始权重一样,有利于实验的比较和改进。

训练过程

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

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

在PyTorch官方文档中说明了在Pytorch的不同提交、不同版本和不同平台上,不能保证完全可重现的结果。此外,即使使用相同的种子,因为存在不同的CPU和GPU,结果也不能重现。
但是对于一个特定的平台和PyTorch发行版上对于特定问题可以进行确定性的计算,其中包括:

  • 设置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数目(线程数)不变,基本上也能够重复实验结果。对于不同线程的随机数种子设置,主要通过DataLoader的worker_init_fn参数来实现。默认情况下使用线程ID作为随机数种子。

1、在运行任何程序之前写入下面代码(可以放在主代码的开头,在导入模块之后):

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

将它封装一个函数:

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 = False
	torch.backends.cudnn.deterministic = True

seed_torch()

2、PyTorch的DataLoader函数中填入为不同的work设置初始化函数,确保您的dataloader在每次调用时都以相同的顺序加载样本(随机种子固定时)。

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。

测试过程

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

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

代码随机种子的设定

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

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

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

参考文献:
PyTorch固定随机数种子
【调参侠的修炼笔记2】随机种子Seed的讲人话解释

python随机数种子seed()入门级理解 但是计算机随机生成的数据怎么直接给呢?种子为李四: [88, 14, 13, 79, 42, 35, 51, 7, 40, 49]种子为李四: [88, 14, 13, 79, 42, 35, 51, 7, 40, 49]种子为1: [14, 85, 77, 26, 50, 45, 66, 79, 10, 3]种子为1: [14, 85, 77, 26, 50, 45, 66, 79, 10, 3]种子为1: [14, 85, 77, 26, 50, 45, 66, 79, 10, 3] 阅读详情

相关推荐

【深度学习】训练前设置随机种子,使实验结果可重复

parser = argparse.ArgumentParser() parser.add_argument('--random-seed', type='int', default=40, help='Random seed.') args = parser.parse_args() pytorch: np.random.seed(args.seed) torch.manual_seed(args.seed) tensorflow: tensorflow:

gaocui883的博客 4570

随机数种子(seed)

在科学技术和机器学习等其他算法相关任务中,我们经常需要用到随机数,为了把握随机数的生成特性,从随机数的随机无序中获得确定和秩序。我们可以利用随机数种子(random seed)来实现这 一目标,随机数种子,可以使得引入了随机数的整个程序,在多次运行中得到确定的,一致的结果。 1. 随机数种子 python自带的random函数: import random # print(help(random)) def test_random_seed_in_std_lib(seed=0, cnt...

love1005lin的博客 2万+

深度学习中的随机数种子:揭秘模型稳定性的关键密码

本文深入探讨了深度学习中的随机数种子对模型稳定性的关键作用,揭示了如何通过固定种子确保实验结果可复现、控制模型初始状态及保持数据预处理一致性。文章提供了全栈种子设置方案和不同框架的配置方法,帮助开发者解决训练结果不一致的问题,提升模型性能的稳定性。

alpha的博客 304

深度学习seed()函数随机种子详解

seed() 函数用于设置随机数生成器的种子,它在生成随机数时提供了可重复性。这个种子是生成随机数的起始点,相同种子生成的随机数序列是确定性的,也就是说,在相同的种子下,每次生成的随机数序列都是一样的。在很多编程语言和库中,seed() 函数被用于初始化伪随机数生成器。在 Python 中,它常常与 random 模块、numpy 库或者机器学习库(比如 PyTorch、TensorFlow)中的随机数生成相关的函数一起使用。

慕溪同学的博客 2万+

深度学习中需要固定的随机数种子

三个的原理和作用都是相似的,所以接下来我只简单介绍。

m0_50652864的博客 1149

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

在深度学习训练中,为什么使用同样的代码,就是和别人得到的结果不一样。 怎么样才能保证自己每次跑同一个实验得到的结果都是一样的。 这就涉及到随机数的设定,代码很短,但是很有用。 强烈建议收藏⭐️,或者把这段代码添加进pycharm活动模板即可快速使用~~~~~。 1. 就这几句话???? import numpy as np import torch import random import os seed_value = 2020 # 设定随机数种子 np.random.seed(seed_valu

Tina姐的博客 9760

深度学习篇---随机数种子

随机数种子是控制随机过程可复现性的关键工具。在Python中,通过设置种子(如random.seed(10))可使随机数序列固定,确保程序多次运行结果一致。在数据分析和深度学习中,种子的核心应用包括:保证实验可重复性(相同种子产生相同数据拆分和模型初始化)、稳定训练过程(固定参数初始状态)、实现可控随机(如数据增强)以及便于调试和团队协作。典型应用场景包括交叉验证、神经网络权重初始化和随机算法控制等。种子机制将不可预测的随机过程转化为可复现的科学实验,是确保研究可靠性和结果可比性的基础技术。

在你不想做的时候,正是应该做的时候。 1770

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

随机种子是什么? 随机种子是针对随机方法而言的。 随机方法:常见的随机方法有生成随机数,以及其他的像随机排序之类的,后者本质上也是基于生成随机数来实现的。在深度学习中,比较常用的随机方法的应用有:网络的随机初始化,训练集的随机打乱等。 关于python中的随机种子——random_state 举个例子,如果我们简单调用random.random()来生成随机数,那么每一次生成的数都是随机的。但是,当我们预先使用random.seed(x)设定好随机种子,基于这个种子...

xixi20200的博客 1172

深度学习篇---深度学习中随机数种子的实现

本文展示了深度学习模型中随机数种子的关键作用。通过PyTorch实现的正弦曲线拟合实验,详细说明了如何设置Python、NumPy、PyTorch和CUDA的随机种子以确保结果可复现。实验对比了相同种子和不同种子下的训练效果,证实相同种子能产生完全一致的训练曲线和预测结果,而不同种子则导致明显差异。文中指出,虽然随机种子不会改变模型的理论上限,但会影响训练过程中的收敛速度和最终精度。建议在重要实验中使用多个种子取平均值,并在模型对比时固定种子以排除随机性干扰。

在你不想做的时候,正是应该做的时候。 1151

VLA模型(具身智能入门十)

Vision Language Action(VLA)模型VLA模型是机器人领域的“感知-理解-执行”一体化框架,通过Transformer架构融合视觉、语言、动作模态,核心目标是让机器人在自然语言驱动下,自主完成复杂操控任务。其定义的核心在于“跨模态统一”与“具象化行动”——不仅能“看懂”“听懂”,更能“做出正确的动作”,是实现通用机器人智能的关键方向。提供通用序列建模骨架,让视觉、语言、动作能以“序列”形式统一处理;ViT将视觉输入转换为序列特征,提供“看”的能力;LLMs。

weixin_39699362的博客 9921

cadence capture CIS 之添加数据库

2021-08-20 cadence capture CIS 之添加数据库准备一、添加数据源 准备 1、数据库文件(*.mdb) 2、电脑上安装好 cadence 软件 一、添加数据源 打开“ ODBC数据源管理器” ( 路径:C:\Windows\SysWOW64\odbcad32.exe ) ...

weixin_42256550的博客 6053

【深度学习】中的batch epoch 随机数种子等问题

①epoch、batch: 所有训练样本在神经网络中都进行了一次正向和反向传播(epoch)就是将所有训练样本训练一次的过程。 然而一个Epoch的样本,数量可能过于庞大,需要把它分成几个小块,也就是分成多个Batch进行训练。 Batch:(批/一批样本): 将整个训练样本分成若干个Batch. Batch_size:每批样本的大小 iteration:训练一个Batch就是一个Iteration. ② 为什么要使用多个epoch 随着epoch数量增加,神经网络的权重更新次数也在增加,曲线由欠拟合会变得

sunnyblogs的博客 1475

科研绘图神器Origin中文版安装后还是英文?手把手教你三步搞定界面汉化

本文详细介绍了Origin软件安装后界面仍显示英文的解决方案,包括基础语言切换、注册表修改和序列号破解三种方法。通过逐步指导,帮助用户快速实现界面汉化,提升科研绘图效率。特别针对教育版用户提供了有效的语言锁定解除方案。

weixin_42524708的博客 1130

【Python】深度学习中随机数种子seed的种类和设置方式

在机器学习和深度学习的实验中,确保实验的可重复性是非常重要的。下面定义的函数的主要目的是设置随机种子以确保代码的随机性操作(如参数初始化、数据集分割、随机数据增强等)在不同运行之间是可重复的。这使得其他研究人员或开发者可以复现相同的实验结果,同时也便于调试和优化模型。

yangweipeng708的博客 3268

Cadence SIP Layout 简单教程-第二章

[从whp1920 网易博客迁移至优快云] 第一章在正式布线之前做了必须做的准备工作,下面进入正题,打开Candence SIP RF Layout GXL软件。 第一节 导入外形尺寸 打开SIP设置文件保存路径,如下图所示进入导入DXF页面,选中前一章时画好的外框图。打开导入界面后,再进入DXF In Edit/View Layers界面选择所有层,导入Class选择DRAWING FOR...

whp1920的博客 6939

超声信号处理——硬件电路中的混频应用

本文介绍了超声多普勒系统的信号处理原理。系统通过波形振荡器产生高频信号,经换能器转换为超声波发射,接收反射信号后与原始信号混频,利用三角函数的积化和差特性产生包含多普勒频移的低频差频信号和高频和频信号。通过低通滤波器滤除高频成分后,即可获得纯净的多普勒信号。这种处理方法将MHz级高频信号转换为可听低频信号,降低了系统复杂度与成本。数学推导表明,差频信号频率正好

fcxgfdjy的博客 1123

随机种子的理解

1、随机数 在百度百科中对随机数的定义为: 真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 根据定义可以看到,真随机数是依赖于物理随机数生成器的。使用较多的就是电子元件中的噪音等较为高级、复杂的物理过程来生成。使用物理性随机数发生器生成的真随机数,可以说是完美再现了生活中的真正的“随机”,也可以称为绝对的公平。 2、伪随机数 在百度百科中对伪随机数的定义为: 真正意义上的随机数(或者随机事件)在

一新新的小白的博客 7636

【Qt】Qt5.15在线安装避坑指南:从代理配置到组件选择的完整实践

本文详细介绍了Qt5.15在线安装的全流程避坑指南,包括代理配置、组件选择和常见问题解决方案。通过使用Fiddler工具和国内镜像源,可显著提升下载速度。文章还提供了组件选择的黄金法则和安装后的验证步骤,帮助开发者高效完成Qt5.15的安装与配置。

weixin_42550052的博客 270

深度学习笔记:随机种子的作用

1.随机数和伪随机数 1.1随机数 真正的随机数是使用物理现象产生的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等,这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。 ----百度百科 根据百科上的定义可以看到,真随机数是依赖于物理随机数生成器的。使用较多的就是电子元件中的噪音等较为高级、复杂的物理过程来生成。 使用物理性随机数发生器生成的真随机数,可以说是完美再...

Activewaste 3万+

人形机器人电源系统硬件开发:从原理图设计到PCB布局的完整流程

人形机器人是“移动的智能终端”,其电源系统如同“心脏+血管”:既要为大脑(主控)、肌肉(电机)、感官(传感器)提供稳定能量,又要在有限体积内应对高动态负载(如跳跃时电机瞬间大电流)。本文聚焦“硬件开发”维度,覆盖从需求分析到PCB制板的完整流程,适合硬件工程师、机器人爱好者快速掌握工程实战方法。

AI天才研究院 2174

【YOLOv11多模态涨点改进】独家创新首发 | TGRS 2025 | 引入CDFIM跨模态差异特征交互模块,通过差异特征提取和融合增强机制,减少了冗余信息,显著提升了小目标的检测精度,高效涨点改进

🔥本文给大家介绍使用 CDFIM跨模态差异特征交互模块改进 YOLOv11多模态目标检测,通过有效的差异特征提取和增强,显著提升了小目标的检测精度,特别是在复杂背景和低对比度环境下。该模块通过残差加法和通道与空间注意力机制,增强了可见光与红外模态之间的互补特征交互,减少了冗余信息,提高了检测稳定性。尽管提升了特征交互,CDFIM 仍保持轻量化设计,计算开销和参数量较低,适合实时检测应用。总的来说,CDFIM 模块在保留原始模态信息的同时优化了特征融合,有效提高了 YOLO 在多模态目标检测中的鲁棒性和精度

Ai缝合怪、助力小伙伴高效发论文 131

深度学习设置随机数种子

【代码】深度学习设置随机数种子。

qq358660877的博客 375

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

随机数种子3407

在网上查阅很久后看到了一篇文章推荐了一个随机数种子,文章题目为“torch.manual seed(3407) is all you need: On the influence of random seeds in deep learning architectures for computer vision”,这个随机数种子是作者多次试验后得出的,在文中作者也提出了实验的缺陷,但这个随机数种子大家还是可以借鉴一下。同时,深度学习中的一些步骤,比如权重初始化、数据集划分、数据增强等,通常涉及到随机性。

weixin_45501482的博客 1190

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

随机数种子的作用域问题

项目场景: 机器学习和深度学习中,为了程序的可复现性,需要设置随机数种子。在跑多个模型时,由于数据的预处理不同,做好的数据集进行划分时使用torch.utils.data.random_split,需要注意的问题 问题描述: 由于我这里使用的torch是1.5.0版本,torch.utils.data.random_split函数没有generator的参数设置种子,因此需要在代码前加入 # Fix Seed torch.manual_seed(0) # 为CPU设置种子用于生成随机数,以使得结果是确定

weixin_42315780的博客 1673

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

随机数种子的作用

设置随机数种子(random seed)的目的是为了确保随机数生成器在每次运行时产生相同的随机数序列,从而保证实验结果的一致性。随机数种子通过初始化随机数生成器的内部状态,使得在相同的种子值下,随机数生成器每次调用时生成的序列是相同的。

帆的博客 3054

python随机种子的作用_简述python&pytorch 随机种子的实现

随机数广泛应用在科学研究, 但是计算机无法产生真正的随机数, 一般成为伪随机数. 它的产生过程: 给定一个随机种子(一个正整数), 根据随机算法和种子产生随机序列. 给定相同的随机种子, 计算机产生的随机数列是一样的(这也许是伪随机的原因).随机种子是什么?随机种子是针对随机方法而言的。随机方法:常见的随机方法有 生成随机数,以及其他的像 随机排序 之类的,后者本质上也是基于生成随机数来实现的。在...

weixin_39722946的博客 1516
上一篇: Tensorboard的使用 ---- SummaryWriter类(pytorch版)
下一篇: nvidia-smi 命令详解
redfish95
博客等级 码龄7年 288粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值