Pytorch固定隨機(jī)數(shù)種子的方法小結(jié)
引言
在對(duì)神經(jīng)網(wǎng)絡(luò)模型進(jìn)行訓(xùn)練時(shí),有時(shí)候會(huì)存在對(duì)訓(xùn)練過(guò)程進(jìn)行復(fù)現(xiàn)的需求。然而,每次運(yùn)行時(shí) Pytorch、Numpy 中的隨機(jī)性將使得該目的變得困難重重。在程序運(yùn)行前固定所有隨機(jī)數(shù)的種子有望解決這一問(wèn)題。基于此,本文記錄了 Pytorch 中的固定隨機(jī)數(shù)種子的方法。
在使用 Pytorch 對(duì)模型進(jìn)行訓(xùn)練時(shí),通常涉及到隨機(jī)數(shù)的模塊包括:Python、Pytorch、Numpy、Cudnn。因此,在開(kāi)始訓(xùn)練前,需要針對(duì)這些涉及隨機(jī)數(shù)的模塊進(jìn)行隨機(jī)數(shù)種子的固定。
1. Python
Python 本身涉及到的隨機(jī)性主要是 Python 自帶的 random 庫(kù)隨機(jī)化和 Hash 隨機(jī)化問(wèn)題,需要通過(guò) os
庫(kù)對(duì)其進(jìn)行限制:
import os, random random.seed(seed) os.environ['PYTHONHASHSEED'] = str(seed)
2. Numpy
在使用 Numpy 庫(kù)取隨機(jī)數(shù)時(shí),需要對(duì)其隨機(jī)數(shù)種子進(jìn)行限制:
import numpy as np np.random.seed(seed)
3. Pytorch
當(dāng) Pytorch 使用 CPU 進(jìn)行運(yùn)算時(shí),需要設(shè)定 CPU 支撐下的 Pytorch 隨機(jī)數(shù)種子:
import torch torch.manual_seed(seed)
當(dāng) Pytorch 使用 GPU 進(jìn)行運(yùn)算時(shí),需要設(shè)定 GPU 支撐下的 Pytorch 隨機(jī)數(shù)種子:
import torch torch.cuda.manual_seed(seed) torch.cuda.manual_seed_all(seed) # 使用多 GPU 時(shí)使用
需要特別注意的是:目前很多博客和知乎回答提出 torch.cuda.manual_seed(seed) 和 torch.cuda.manual_seed_all(seed) 具有相同的作用。這個(gè)結(jié)論需要注意 Pytorch 版本。在筆者所用的 Pytorch 2.1 版本下,這兩個(gè)函數(shù)的作用完全不同。參考官方文檔:torch.cuda.manual_seed 和 torch.cuda.manual_seed_all(seed)
當(dāng) Pytorch 使用 Cudnn 進(jìn)行加速運(yùn)算時(shí),還需要限制 Cudnn 在加速過(guò)程中涉及到的隨機(jī)策略:
import torch torch.backends.cudnn.deterministic = True torch.backends.cudnn.benchmark = False
總結(jié)
基于上述庫(kù)的固定隨機(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ī)性的第三方庫(kù),則需要根據(jù)上述思路對(duì)該固定隨機(jī)數(shù)方法進(jìn)行動(dòng)態(tài)補(bǔ)充。
以上就是Pytorch固定隨機(jī)數(shù)種子的方法小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于Pytorch固定隨機(jī)數(shù)種子的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Anaconda中利用conda創(chuàng)建、激活、刪除、添加新環(huán)境
在使用Python開(kāi)發(fā)項(xiàng)目或者編寫(xiě)腳本的時(shí)候通常需要建立不同版本的Python的虛擬環(huán)境,本文主要介紹了Anaconda中利用conda創(chuàng)建、激活、刪除、添加新環(huán)境,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox)
這篇文章主要介紹了selenium設(shè)置proxy、headers的方法(phantomjs、Chrome、Firefox),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11Python3.7 dataclass使用指南小結(jié)
本文將帶你走進(jìn)python3.7的新特性dataclass,通過(guò)本文你將學(xué)會(huì)dataclass的使用并避免踏入某些陷阱。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-02-02Python如何使用qrcode生成指定內(nèi)容的二維碼并在GUI界面顯示
現(xiàn)在二維碼很流行,大街小巷大小商品廣告上的二維碼標(biāo)簽都隨處可見(jiàn),下面這篇文章主要給大家介紹了關(guān)于如何使用qrcode生成指定內(nèi)容的二維碼并在GUI界面顯示的相關(guān)資料,需要的朋友可以參考下2022-09-09講解Python中for循環(huán)下的索引變量的作用域
這篇文章主要介紹了講解Python中for循環(huán)下的索引變量的作用域,是Python學(xué)習(xí)當(dāng)中的基礎(chǔ)知識(shí),本文給出了Python3的示例幫助讀者理解,需要的朋友可以參考下2015-04-04簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)python收發(fā)郵件功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-01-01Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目的實(shí)現(xiàn)步驟
本文主要介紹了Pycharm社區(qū)版創(chuàng)建Flask項(xiàng)目,包括設(shè)置Python環(huán)境、安裝Flask庫(kù)以及創(chuàng)建基本的項(xiàng)目結(jié)構(gòu),具有一定的參考價(jià)值,感興趣的可以了解一下2024-06-06如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用
這篇文章主要介紹了如何使用python3獲取當(dāng)前路徑及os.path.dirname的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12