Pytorch基础:设置随机种子

相关阅读

Pytorch基础icon-default.png?t=O83Ahttps://blog.csdn.net/weixin_45791458/category_12457644.html?spm=1001.2014.3001.5482


        有时候,如果需要代码在多个运行中具有可重复性,可以通过以下方式来设置随机种子:

import torch
import numpy as np
import random

def 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 np

def 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会根据每个卷积层的输入大小和配置动态选择最快的实现方法。

猜你喜欢

转载自blog.csdn.net/weixin_45791458/article/details/142905841