相关阅读
Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482
有时候,如果需要代码在多个运行中具有可重复性,可以通过以下方式来设置随机种子:
import torch
import numpy as np
import randomdef set_seed(seed):random.seed(seed) # 设置Python的随机种子np.random.seed(seed) # 设置NumPy的随机种子torch.manual_seed(seed) # 设置PyTorch的CPU随机种子torch.cuda.manual_seed(seed) # 设置当前GPU的随机种子(如果使用GPU)torch.cuda.manual_seed_all(seed) # 设置所有GPU的随机种子(如果使用多个GPU)torch.backends.cudnn.deterministic = True # 确保每次卷积操作结果一致torch.backends.cudnn.benchmark = False # 禁用CUDNN的自动优化# 调用这个函数并传递相同的seed值
set_seed(42)
torch.manual_seed()函数设置了CPU的随机种子(在device=CPU的情况下)。
torch.cuda.manual_seed()函数设置了当前GPU的随机种子(在device=当前GPU的情况下),有关当前GPU的设置方式,见Pytorch基础:torch.cuda.set_device函数。
torch.cuda.manual_seed_all()函数设置了所有GPU的随机种子(在使用多个GPU的情况下)。
上面三个函数会影响下面这些有随机性的函数:
- torch.rand():生成[0, 1)区间的均匀分布随机数张量。
- torch.randn():生成均值为0,方差为1的标准正态分布随机数张量。
- torch.randint():生成指定范围内的随机整数张量。
- torch.randperm():生成从0到n-1的随机排列张量(dataloader的打乱就是靠这个实现)。
- torch.bernoulli():根据伯努利分布生成随机张量。
- torch.normal():根据正态分布生成随机张量。
- torch.randlike():生成[0, 1)区间的均匀分布随机数张量,与给定张量形状相同。
- torch.nn.init.xavier_uniform_():根据Xavier均匀分布初始化权重。
- torch.nn.init.kaiming_normal_():根据He正态分布初始化权重。
- .....
如果重新调用这三个函数,会导致重置相应的随机数生成器的状态,因此生成的随机数序列又会从头开始,如下所示。
import torch
import random
import numpy as npdef set_seed(seed):random.seed(seed) # 设置Python的随机种子np.random.seed(seed) # 设置NumPy的随机种子torch.manual_seed(seed) # 设置PyTorch的随机种子torch.cuda.manual_seed(seed) # 设置PyTorch CUDA的随机种子(如果使用GPU)torch.cuda.manual_seed_all(seed) # 设置所有GPU的随机种子(如果使用多个GPU)torch.backends.cudnn.deterministic = True # 保证卷积操作的确定性torch.backends.cudnn.benchmark = False # 禁用CUDNN的自动优化# 设置种子并生成随机张量
set_seed(42)
a = torch.rand(5)
print(a) # 输出:tensor([0.3745, 0.9507, 0.7319, 0.5987, 0.1560])# 再次设置相同的种子并生成随机张量
set_seed(42)
b = torch.rand(5)
print(b) # 输出:tensor([0.3745, 0.9507, 0.7319, 0.5987, 0.1560])
torch.backends.cudnn.deterministic=True表示启用cuDNN的确定性行为,确保每次卷积操作产生相同的结果。因为cuDNN在默认情况下会进行某些非确定性的优化,这些优化有时会导致相同输入在不同次运行时产生略微不同的结果。
torch.backends.cudnn.benchmark=False表示禁用cuDNN的自动优化功能。默认情况下cuDNN会根据每个卷积层的输入大小和配置动态选择最快的实现方法。