Pytorch固定随机数种子的方法小结

 更新时间:2023年12月08日 11:15:18   作者:lgc0208  
在对神经网络模型进行训练时,有时候会存在对训练过程进行复现的需求,然而,每次运行时 Pytorch、Numpy 中的随机性将使得该目的变得困难重重,基于此,本文记录了 Pytorch 中的固定随机数种子的方法,需要的朋友可以参考下

引言

在对神经网络模型进行训练时,有时候会存在对训练过程进行复现的需求。然而,每次运行时 Pytorch、Numpy 中的随机性将使得该目的变得困难重重。在程序运行前固定所有随机数的种子有望解决这一问题。基于此,本文记录了 Pytorch 中的固定随机数种子的方法。

在使用 Pytorch 对模型进行训练时,通常涉及到随机数的模块包括:Python、Pytorch、Numpy、Cudnn。因此,在开始训练前,需要针对这些涉及随机数的模块进行随机数种子的固定。

1. Python

Python 本身涉及到的随机性主要是 Python 自带的 random 库随机化和 Hash 随机化问题,需要通过 os 库对其进行限制:

import os, random
random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)

2. Numpy

在使用 Numpy 库取随机数时,需要对其随机数种子进行限制:

import numpy as np
np.random.seed(seed)

3. Pytorch

当 Pytorch 使用 CPU 进行运算时,需要设定 CPU 支撑下的 Pytorch 随机数种子:

import torch
torch.manual_seed(seed)

当 Pytorch 使用 GPU 进行运算时,需要设定 GPU 支撑下的 Pytorch 随机数种子:

import torch
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed) # 使用多 GPU 时使用

需要特别注意的是:目前很多博客和知乎回答提出 torch.cuda.manual_seed(seed) 和 torch.cuda.manual_seed_all(seed) 具有相同的作用。这个结论需要注意 Pytorch 版本。在笔者所用的 Pytorch 2.1 版本下,这两个函数的作用完全不同。参考官方文档:torch.cuda.manual_seed 和 torch.cuda.manual_seed_all(seed)

当 Pytorch 使用 Cudnn 进行加速运算时,还需要限制 Cudnn 在加速过程中涉及到的随机策略:

import torch
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False

总结

基于上述库的固定随机数方法总结为:

def set_random_seed(seed: int) -> None:
	random.seed(seed)
	os.environ['PYTHONHASHSEED'] = str(seed)
	np.random.seed(seed)
	torch.manual_seed(seed)
	torch.cuda.manual_seed_all(seed)
	torch.backends.cudnn.benchmark = False
	torch.backends.cudnn.deterministic = True

seed = 114514
set_torch_seed(seed)

如果在实践中还调用了其他涉及随机性的第三方库,则需要根据上述思路对该固定随机数方法进行动态补充。

以上就是Pytorch固定随机数种子的方法小结的详细内容,更多关于Pytorch固定随机数种子的资料请关注脚本之家其它相关文章!

相关文章

  • Anaconda中利用conda创建、激活、删除、添加新环境

    Anaconda中利用conda创建、激活、删除、添加新环境

    在使用Python开发项目或者编写脚本的时候通常需要建立不同版本的Python的虚拟环境,本文主要介绍了Anaconda中利用conda创建、激活、删除、添加新环境,具有一定的参考价值,感兴趣的可以了解一下
    2024-04-04
  • selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)

    selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox)

    这篇文章主要介绍了selenium设置proxy、headers的方法(phantomjs、Chrome、Firefox),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Python中python-nmap模块的使用介绍

    Python中python-nmap模块的使用介绍

    这篇文章主要介绍了Python中python-nmap模块的使用,主要是portScanner()类方法展开全文,portScanner()类用于实现对指定主机进行端口扫描,更多介绍内容,需要的朋友可以参考一下
    2022-02-02
  • Python异常处理中容易犯得错误总结

    Python异常处理中容易犯得错误总结

    本文整理了python异常处理中finally的两个容易犯的错误,适合新手朋友的学习,感兴趣的朋友可以参考下
    2021-06-06
  • Python3.7 dataclass使用指南小结

    Python3.7 dataclass使用指南小结

    本文将带你走进python3.7的新特性dataclass,通过本文你将学会dataclass的使用并避免踏入某些陷阱。小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-02-02
  • Python如何使用qrcode生成指定内容的二维码并在GUI界面显示

    Python如何使用qrcode生成指定内容的二维码并在GUI界面显示

    现在二维码很流行,大街小巷大小商品广告上的二维码标签都随处可见,下面这篇文章主要给大家介绍了关于如何使用qrcode生成指定内容的二维码并在GUI界面显示的相关资料,需要的朋友可以参考下
    2022-09-09
  • 讲解Python中for循环下的索引变量的作用域

    讲解Python中for循环下的索引变量的作用域

    这篇文章主要介绍了讲解Python中for循环下的索引变量的作用域,是Python学习当中的基础知识,本文给出了Python3的示例帮助读者理解,需要的朋友可以参考下
    2015-04-04
  • 简单实现python收发邮件功能

    简单实现python收发邮件功能

    这篇文章主要教大家如何简单实现python收发邮件功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • Pycharm社区版创建Flask项目的实现步骤

    Pycharm社区版创建Flask项目的实现步骤

    本文主要介绍了Pycharm社区版创建Flask项目,包括设置Python环境、安装Flask库以及创建基本的项目结构,具有一定的参考价值,感兴趣的可以了解一下
    2024-06-06
  • 如何使用python3获取当前路径及os.path.dirname的使用

    如何使用python3获取当前路径及os.path.dirname的使用

    这篇文章主要介绍了如何使用python3获取当前路径及os.path.dirname的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论