排除使用PyTorch时的随机性

  训练模型时,同样的超参,同样的参数初始化方式,但训练的结果却不一样,很可能的原因就是训练框架中的随机性,主要是random seed和cudnn带来的。

  1. 排除PyTorch的随机性:
torch.manual_seed(seed)  # cpu种子
# torch.cuda.manual_seed(seed) # 当前GPU的种子
torch.cuda.manual_seed_all(seed)  # 所有可用GPU的种子
  1. 排除第三方库的随机性
np.random.seed(seed)
random.seed(seed)
  1. 排除cudnn加速的随机性:
torch.backends.cudnn.enabled = True   # 默认值
torch.backends.cudnn.benchmark = False  # 默认为False
torch.backends.cudnn.deterministic = True # 默认为False;benchmark为True时,y要排除随机性必须为True

上述三个变量的值可通过以下代码查看:

import torch.backends.cudnn as cudnn

print(cudnn.CudnnModule.enabled)
print(cudnn.CudnnModule.benchmark)
print(cudnn.CudnnModule.deterministic)

需要注意的是,如果项目中包含多个文件,为了让所有的文件中的随机数种子都相同,应该让所有的文件都把定义的随机数种子import进来。

参考:
Reproducibility — PyTorch master documentation

你可能感兴趣的:(PyTorch,pytorch)