Pytorch固定隨機(jī)數(shù)種子的方法小結(jié)
引言
在對神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練時,有時候會存在對訓(xùn)練過程進(jìn)行復(fù)現(xiàn)的需求。然而,每次運(yùn)行時 Pytorch、Numpy 中的隨機(jī)性將使得該目的變得困難重重。在程序運(yùn)行前固定所有隨機(jī)數(shù)的種子有望解決這一問題?;诖耍疚挠涗浟?Pytorch 中的固定隨機(jī)數(shù)種子的方法。
在使用 Pytorch 對模型進(jìn)行訓(xùn)練時,通常涉及到隨機(jī)數(shù)的模塊包括:Python、Pytorch、Numpy、Cudnn。因此,在開始訓(xùn)練前,需要針對這些涉及隨機(jī)數(shù)的模塊進(jìn)行隨機(jī)數(shù)種子的固定。
1. Python
Python 本身涉及到的隨機(jī)性主要是 Python 自帶的 random 庫隨機(jī)化和 Hash 隨機(jī)化問題,需要通過 os 庫對其進(jìn)行限制:
import os, random random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed)
2. Numpy
在使用 Numpy 庫取隨機(jī)數(shù)時,需要對其隨機(jī)數(shù)種子進(jìn)行限制:
import numpy as np np.random.seed(seed)
3. Pytorch
當(dāng) Pytorch 使用 CPU 進(jìn)行運(yùn)算時,需要設(shè)定 CPU 支撐下的 Pytorch 隨機(jī)數(shù)種子:
import torch torch.manual_seed(seed)
當(dāng) Pytorch 使用 GPU 進(jìn)行運(yùn)算時,需要設(shè)定 GPU 支撐下的 Pytorch 隨機(jī)數(shù)種子:
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) 具有相同的作用。這個結(jié)論需要注意 Pytorch 版本。在筆者所用的 Pytorch 2.1 版本下,這兩個函數(shù)的作用完全不同。參考官方文檔:torch.cuda.manual_seed 和 torch.cuda.manual_seed_all(seed)
當(dāng) Pytorch 使用 Cudnn 進(jìn)行加速運(yùn)算時,還需要限制 Cudnn 在加速過程中涉及到的隨機(jī)策略:
import torch torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False
總結(jié)
基于上述庫的固定隨機(jī)數(shù)方法總結(jié)為:
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)
如果在實(shí)踐中還調(diào)用了其他涉及隨機(jī)性的第三方庫,則需要根據(jù)上述思路對該固定隨機(jī)數(shù)方法進(jìn)行動態(tài)補(bǔ)充。
以上就是Pytorch固定隨機(jī)數(shù)種子的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Pytorch固定隨機(jī)數(shù)種子的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
如何使用python的ctypes調(diào)用醫(yī)保中心的dll動態(tài)庫下載醫(yī)保中心的賬單
這篇文章主要介紹了如何使用python的ctypes調(diào)用醫(yī)保中心的dll動態(tài)庫下載醫(yī)保中心的賬單,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-05-05
python3使用pandas獲取股票數(shù)據(jù)的方法
今天小編就為大家分享一篇python3使用pandas獲取股票數(shù)據(jù)的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12
Python實(shí)現(xiàn)字符串中某個字母的替代功能
小編想實(shí)現(xiàn)這樣一個功能:將輸入字符串中的字母 “i” 變成字母 “p”。想著很簡單,怎么實(shí)現(xiàn)呢?下面小編給大家?guī)砹薖ython實(shí)現(xiàn)字符串中某個字母的替代功能,感興趣的朋友一起看看吧2019-10-10
修改默認(rèn)的pip版本為對應(yīng)python2.7的方法
今天小編就為大家分享一篇修改默認(rèn)的pip版本為對應(yīng)python2.7的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11

