深度学习中的随机种子torch.manual_seed(number)、torch.cuda.manual_seed(number)

训练模型过程中,会遇到很多的随机性设置,设置随机性并多次实验的结果更加有说服力。但是现在发论文越来越要求模型的可复现性,这时候不得不控制代码的随机性问题
且每次随机的初始权重一样,有利于实验的比较和改进

须知:随机种子和神经网络训练没有直接关系,随机种子的作用就是产生权重为初始条件的随机数。神经网络效果的好坏直接取决于学习率和迭代次数。

简单的说,计算机中生成随机数的过程并不随机百,但是其初始数(种子)是随机的。在深度学习中,(比如深度神经网络)我们常常需要对网络中超参数设定初始值,比如权重,在这里我们需要用到一些生成随机数的函数,这些函数一般通过手动设定种子,如果种子设定为相同的,那么得到的初始权重就是一样的。

最优随机种子不应该去找,随机性的存在正好用来评估模型的鲁棒性。一个优秀的模型,不会因为随机初始的位置略微不同,而找不到最优的位置。这是模型本身应该要化解的工作,而不是人为选择一个随机数。

在这里插入图片描述
相关函数:

  • torch.manual_seed(number):为CPU中设置种子,生成随机数;
  • torch.cuda.manual_seed(number):为特定GPU设置种子,生成随机数;
  • torch.cuda.manual_seed_all(number):为所有GPU设置种子,生成随机数;

torch.manual_seed(1)是为了设置CPU的的随机数固定,使得紧跟着运行同一个.py文件的rand()函数==【随机函数】==生成的值是固定的随机!

但是设置随机种子后,是每次运行test.py文件的输出结果都一样,而不是每次随机函数生成的结果一样:

# test.py
import torch
torch.manual_seed(0)
print(torch.rand(1))
print(torch.rand(1))

输出:

tensor([0.4963])
tensor([0.7682])

如果你就是想要每次运行随机函数生成的结果都一样,那你可以在每个随机函数前都设置一模一样的随机种子:

# test.py
import torch
torch.manual_seed(0)
print(torch.rand(1))
torch.manual_seed(0)
print(torch.rand(1))

输出:

tensor([0.4963])
tensor([0.4963])

参考:【PyTorch】torch.manual_seed() 详解

<think>嗯,用户想了解在深度学习中如何设置随机种子以确保实验可重复性,特别是在PyTorch、TensorFlow和NumPy中。首先,我需要回忆一下这些库中设置随机种子的方法。记得PyTorch需要设置多个部分的种子,比如torch.manual_seed,还有CUDA相关的。而TensorFlow可能和PyTorch类似,但具体函数可能不同。NumPy的话应该用np.random.seed,不过可能版本不同方法有变化? 然后,用户提到的引用里有一些例子,比如引用1中的TensorFlow设置,引用2、3、4提到PyTorch和numpy的设置步骤。需要把这些信息整合起来,分步骤说明。同时,用户可能需要知道随机性来源,比如数据洗牌、网络初始化、Dropout层等,这些都需要控制。 另外,要注意不同库之间的相互影响,比如同时使用PyTorch和NumPy时,可能需要分别设置它们的种子。还有操作系统和Python内置的random模块,这也是需要设置的,可能用户没考虑到这点,但引用4提到了os和random模块。 可能还需要提到禁用CUDA随机性来源,比如设置deterministic算法和禁用benchmark,这样可以避免GPU带来的不确定性。不过PyTorch中设置deterministic可能会影响性能,这点也要提醒用户。 步骤方面,应该分框架说明,每个框架的具体函数和注意事项。例如,PyTorch部分要包括torch.manual_seed,DataLoader的worker种子CUDA设置;TensorFlow部分可能有tf.random.set_seed,还有numpy和Python的种子;NumPy单独设置。 最后,要给出示例代码,综合所有设置,方便用户参考。同时,生成的相关问题需要考虑用户可能遇到的后续问题,比如性能影响、其他框架、不同版本差异、多GPU情况等,这样用户能进一步了解。</think>在深度学习中设置随机种子是实现实验可复现性的关键步骤。以下是针对PyTorch、TensorFlow和NumPy的具体设置方法,分步骤说明: ### 一、设置随机种子的必要性 随机性来源包括数据集的随机洗牌、网络参数初始化、Dropout层、优化器随机梯度下降等[^3]。通过设置种子可确保: 1. 相同代码多次运行结果一致 2. 不同设备/环境下结果可复现 3. 实验结果可验证和对比 ### 二、具体框架设置方法 #### PyTorch设置 ```python import torch import numpy as np import random # 基础设置 torch.manual_seed(2023) # CPU随机种子 torch.cuda.manual_seed(2023) # GPU随机种子 torch.cuda.manual_seed_all(2023) # 多GPU情况 # 高级设置(确保完全确定性) torch.backends.cudnn.deterministic = True # 禁用非确定性算法 torch.backends.cudnn.benchmark = False # 关闭自动优化 # 关联库设置 np.random.seed(2023) # NumPy随机种子 random.seed(2023) # Python内置随机种子 ``` #### TensorFlow设置 ```python import tensorflow as tf import numpy as np import random # 基础设置 tf.random.set_seed(2023) # TensorFlow全局种子 # 会话级设置(TF 1.x兼容) if tf.__version__.startswith('1.'): from tensorflow import keras tf.set_random_seed(2023) session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1) sess = tf.Session(graph=tf.get_default_graph(), config=session_conf) keras.backend.set_session(sess) # 关联库设置 np.random.seed(2023) random.seed(2023) ``` #### NumPy设置 ```python import numpy as np np.random.seed(2023) # 控制所有使用NumPy的随机操作 ``` ### 三、注意事项 1. **执行顺序**:先设置PyTorch/TensorFlow,再设置NumPy和Python内置随机数 2. **数据加载器**:在PyTorch中需固定`worker_init_fn` ```python def seed_worker(worker_id): worker_seed = torch.initial_seed() % 2**32 np.random.seed(worker_seed) random.seed(worker_seed) DataLoader(..., worker_init_fn=seed_worker) ``` 3. **GPU不确定性**:即使设置种子,某些CUDA操作仍可能有微小误差 4. **版本差异**:TensorFlow 2.x与1.x的设置方式不同[^1][^4] ### 四、完整示例(PyTorch) ```python import torch import numpy as np import random def set_seed(seed=2023): torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) np.random.seed(seed) random.seed(seed) torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False set_seed() # 应用所有设置 ``` ### 五、验证方法 通过多次运行以下代码验证: ```python print(torch.rand(1)) # 应每次输出相同值 print(np.random.rand()) # 应保持相同 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值