固定所有(pytorch,python,numpy)的随机种子

    args.seed =42
    torch.manual_seed(args.seed)
    torch.cuda.manual_seed_all(args.seed)
    torch.cuda.manual_seed(args.seed)

    np.random.seed(args.seed)
    random.seed(args.seed)
    torch.backends.cudnn.deterministic = True

在需要生成随机数据的实验中,每次实验都需要生成数据。设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致了,有利于实验的比较和改进。使得每次运行该 .py 文件时生成的随机数相同。

pytorch (cpu,gpu,多gpu)

1. 为CPU中设置种子,生成随机数:

torch.manual_seed(seed)

2. 为特定GPU设置种子,生成随机数:

torch.cuda.manual_seed(number)

3. 为所有GPU设置种子,生成随机数:

torch.cuda.manual_seed_all(number)

不设置随机种子,则每次随机结果不同。设置之后随机结果相同。

# 不设置随机种子
import torch
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数


# 设置随机种子
import torch
# 设置随机种子
torch.manual_seed(0) # 不同的随机种子生成随机数不同,换成其他值随机数不一样
# 生成随机数
print(torch.rand(1)) # 返回一个张量,包含了从区间[0, 1)的均匀分布中抽取的一组随机数
print(torch.rand(1)) # 设置随机种子后,是每次运行.py文件的输出结果都一样,随机函数结果不同。
# 输出结果:
tensor([0.4963])
tensor([0.7682])


#若想要结果都一样,那你可以在每个随机函数前都设置一模一样的随机种子
torch.manual_seed(0)
print(torch.rand(1))
torch.manual_seed(0)
print(torch.rand(1))
# 输出结果:
tensor([0.4963])
tensor([0.4963])


numpy

import numpy as np

np.random.seed(1)
L1 = np.random.randn(3, 3)
np.random.seed(1)
L2 = np.random.randn(3, 3)
print(L1)
print(L2)

# 结果
[[ 1.62434536 -0.61175641 -0.52817175]
 [-1.07296862  0.86540763 -2.3015387 ]
 [ 1.74481176 -0.7612069   0.3190391 ]]
 
[[ 1.62434536 -0.61175641 -0.52817175]
 [-1.07296862  0.86540763 -2.3015387 ]
 [ 1.74481176 -0.7612069   0.3190391 ]]

python

random.seed(1)
print(random.randrange(10))

本质就是使用自己的函数,使用种子后随机数固定。像random.seed(),使用random的随机函数就会固定随机数。使用np.random.seed(),np.random.randn()就会固定随机数。

参考:

【PyTorch】torch.manual_seed() 详解_想变厉害的大白菜的博客-优快云博客

### 如何在 PyTorch 中设置和固定随机种子 为了确保实验的可复现性,在 PyTorch 中可以通过多种方式来控制随机性的来源。以下是详细的说明: #### 1. 控制 Python 的内置随机数生成器 通过 `random.seed(seed)` 来设定全局随机种子,这会影响 Python 基础环境中所有的随机操作[^3]。 ```python import random seed = 42 random.seed(seed) ``` #### 2. 控制 Numpy随机数生成器 如果项目中涉及 Numpy 库的操作,则需要显式调用 `np.random.seed(seed)` 来固定随机行为。这样可以保证所有基于 Numpy随机过程一致。 ```python import numpy as np np.random.seed(seed) ``` #### 3. 控制 PyTorch随机数生成器 对于 PyTorch 自身的随机化部分,需使用 `torch.manual_seed(seed)` 和 `torch.cuda.manual_seed_all(seed)` 方法分别针对 CPU 和 GPU 进行初始化。 ```python import torch torch.manual_seed(seed) # 设定CPU上的随机种子 torch.cuda.manual_seed_all(seed) # 如果有多个GPU设备,也需要单独处理它们各自的随机状态 ``` #### 4. 关闭 cuDNN 加速优化选项 当运行模型时启用了 NVIDIA 提供的 cuDNN 支持,默认情况下它会选择性能最优但可能不可预测的具体卷积算法实现路径。因此建议关闭自动选择功能并强制指定确定版本的计算方法以达到完全重现的目的。 ```python torch.backends.cudnn.benchmark = False # 禁用CuDNN加速模式下的动态调整策略 torch.backends.cudnn.deterministic = True # 使用固定的cuDNN算法而非自适应最佳方案 ``` 即使完成了上述配置仍有可能遇到无法预期的结果差异情况发生,比如某些第三方扩展包内部存在未受控因素或者硬件层面固有的不确定性等问题都会影响最终输出的一致程度[^1]。此时应该仔细排查是否存在其他潜在干扰项,并尽可能减少外部依赖引入额外变化空间的可能性。 综上所述,按照以上步骤逐一完成相应参数调节之后基本能够满足大多数场景下关于再现能力的需求标准。 ```python def set_random_seeds(seed=42): import os import random import numpy as np import torch # Set python hash seed to fixed value. os.environ['PYTHONHASHSEED'] = str(seed) # Seed the global generators used by libraries like NumPy and standard library 'random'. random.seed(seed) np.random.seed(seed) # Torch seeds must be set separately for both CPU/GPU operations. torch.manual_seed(seed) if torch.cuda.is_available(): torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) # Disable cudnn auto-tuning features that may cause non-determinism. torch.backends.cudnn.enabled = False torch.backends.cudnn.benchmark = False torch.backends.cudnn.deterministic = True ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值