在使用模型进行训练的时候,通常为了保证模型的可复现性,会设置固定随机种子。

参考代码:

# fix random seed
def same_seeds(seed):
    torch.manual_seed(seed)  # 固定随机种子(CPU)
    if torch.cuda.is_available():  # 固定随机种子(GPU)
        torch.cuda.manual_seed(seed)  # 为当前GPU设置
        torch.cuda.manual_seed_all(seed)  # 为所有GPU设置
    np.random.seed(seed)  # 保证后续使用random函数时,产生固定的随机数
    torch.backends.cudnn.benchmark = False  # GPU、网络结构固定,可设置为True
    torch.backends.cudnn.deterministic = True  # 固定网络结构
  • torch.manual_seed()
  • torch.cuda.manual_seed()
  • torch.cuda.manual_seed_all()
  • np.random.seed()
  • torch.backends.cudnn.benchmark
  • torch.backends.cudnn.deterministic

例如,由于上述np.random.seed(seed)已经设置了固定的随机种子。

a = np.random.randn(3)
b = np.random.randn(3)

上述a、b的结果相同。

torch.backends.cudnn.benchmark是用于固定网络结构的模型优化,用于提高模型的效率,在模型刚开始训练的时候会花费一些时间,选择模型最适合的算法,因此适合于在GPU下使用,且是固定的网络结构,否则反复搜索反而花费更多的时间,因此GPU可用时再设置为Ture(默认为False)

if args.use_gpu and torch.cuda.is_available():
    device = torch.device('cuda')
    torch.backends.cudnn.benchmark = True
else:
    device = torch.device('cpu')

torch.backends.cudnn.deterministic设置固定的网络结构。固定了随机输入之后,再固定网络结构,保证模型每次运行都能得到相同的结果,保证模型的可复现性。

参考:

  1. torch.manual_seed(1)是干嘛用的?:https://www.zhihu.com/question/288350769
  2. np.random.seed()函数:https://zhuanlan.zhihu.com/p/266472620
  3. torch.backends.cudnn.benchmark ?!:https://zhuanlan.zhihu.com/p/73711222
  4. 【pytorch】torch.backends.cudnn.deterministic:https://blog.csdn.net/weixin_41990278/article/details/106268969
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐