欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PyTorch 如何設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)

 更新時(shí)間:2021年05月12日 11:55:00   作者:淺笑顧盼  
這篇文章主要介紹了PyTorch 設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧

由于在模型訓(xùn)練的過(guò)程中存在大量的隨機(jī)操作,使得對(duì)于同一份代碼,重復(fù)運(yùn)行后得到的結(jié)果不一致。

因此,為了得到可重復(fù)的實(shí)驗(yàn)結(jié)果,我們需要對(duì)隨機(jī)數(shù)生成器設(shè)置一個(gè)固定的種子。

CUDNN

cudnn中對(duì)卷積操作進(jìn)行了優(yōu)化,犧牲了精度來(lái)?yè)Q取計(jì)算效率。如果需要保證可重復(fù)性,可以使用如下設(shè)置:

from torch.backends import cudnn
cudnn.benchmark = False            # if benchmark=True, deterministic will be False
cudnn.deterministic = True

不過(guò)實(shí)際上這個(gè)設(shè)置對(duì)精度影響不大,僅僅是小數(shù)點(diǎn)后幾位的差別。所以如果不是對(duì)精度要求極高,其實(shí)不太建議修改,因?yàn)闀?huì)使計(jì)算效率降低。

Pytorch

torch.manual_seed(seed)            # 為CPU設(shè)置隨機(jī)種子
torch.cuda.manual_seed(seed)       # 為當(dāng)前GPU設(shè)置隨機(jī)種子
torch.cuda.manual_seed_all(seed)   # 為所有GPU設(shè)置隨機(jī)種子

Python & Numpy

如果讀取數(shù)據(jù)的過(guò)程采用了隨機(jī)預(yù)處理(如RandomCrop、RandomHorizontalFlip等),那么對(duì)python、numpy的隨機(jī)數(shù)生成器也需要設(shè)置種子。

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

Dataloader

如果dataloader采用了多線程(num_workers > 1), 那么由于讀取數(shù)據(jù)的順序不同,最終運(yùn)行結(jié)果也會(huì)有差異。

也就是說(shuō),改變num_workers參數(shù),也會(huì)對(duì)實(shí)驗(yàn)結(jié)果產(chǎn)生影響。

目前暫時(shí)沒(méi)有發(fā)現(xiàn)解決這個(gè)問(wèn)題的方法,但是只要固定num_workers數(shù)目(線程數(shù))不變,基本上也能夠重復(fù)實(shí)驗(yàn)結(jié)果。

補(bǔ)充:pytorch 固定隨機(jī)數(shù)種子踩過(guò)的坑

1.初步固定

 def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     torch.cuda.manual_seed(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True
     torch.backends.cudnn.enabled = False
     torch.backends.cudnn.benchmark = False
     #torch.backends.cudnn.benchmark = True #for accelerating the running
 setup_seed(2019)

2.繼續(xù)添加如下代碼:

tensor_dataset = ImageList(opt.training_list,transform)
def _init_fn(worker_id): 
    random.seed(10 + worker_id)
    np.random.seed(10 + worker_id)
    torch.manual_seed(10 + worker_id)
    torch.cuda.manual_seed(10 + worker_id)
    torch.cuda.manual_seed_all(10 + worker_id)
dataloader = DataLoader(tensor_dataset,                        
                    batch_size=opt.batchSize,     
                    shuffle=True,     
                    num_workers=opt.workers,
                    worker_init_fn=_init_fn)

3.在上面的操作之后發(fā)現(xiàn)加載的數(shù)據(jù)多次試驗(yàn)大部分一致了

但是仍然有些數(shù)據(jù)是不一致的,后來(lái)發(fā)現(xiàn)是pytorch版本的問(wèn)題,將原先的0.3.1版本升級(jí)到1.1.0版本,問(wèn)題解決

4.按照上面的操作后雖然解決了問(wèn)題

但是由于將cudnn.benchmark設(shè)置為False,運(yùn)行速度降低到原來(lái)的1/3,所以繼續(xù)探索,最終解決方案是把第1步變?yōu)槿缦?,同時(shí)將該部分代碼盡可能放在主程序最開(kāi)始的部分,例如:

import torch
import torch.nn as nn
from torch.nn import init
import pdb
import torch.nn.parallel
import torch.nn.functional as F
import torch.backends.cudnn as cudnn
import torch.optim as optim
import torch.utils.data
from torch.utils.data import DataLoader, Dataset
import sys
gpu_id = "3,2"
os.environ["CUDA_VISIBLE_DEVICES"] = gpu_id
print('GPU: ',gpu_id)
def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     torch.cuda.manual_seed(seed)
     np.random.seed(seed)
     random.seed(seed)
     cudnn.deterministic = True
     #cudnn.benchmark = False
     #cudnn.enabled = False

setup_seed(2019)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Python進(jìn)程池log死鎖問(wèn)題分析及解決

    Python進(jìn)程池log死鎖問(wèn)題分析及解決

    最近線上運(yùn)行的一個(gè)python任務(wù)負(fù)責(zé)處理一批數(shù)據(jù),為提高處理效率,使用了python進(jìn)程池,并會(huì)打印log,本文給大家分析了Python進(jìn)程池log死鎖問(wèn)題以及解決方法,需要的朋友可以參考下
    2024-01-01
  • Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn)

    Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn)

    這篇文章主要介紹了Python OpenCV高斯金字塔與拉普拉斯金字塔的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 用python打包exe應(yīng)用程序及PyInstaller安裝方式

    用python打包exe應(yīng)用程序及PyInstaller安裝方式

    PyInstaller 制作出來(lái)的執(zhí)行文件并不是跨平臺(tái)的,如果需要為不同平臺(tái)打包,就要在相應(yīng)平臺(tái)上運(yùn)行PyInstaller進(jìn)行打包。今天通過(guò)本文給大家介紹用python打包exe應(yīng)用程序及PyInstaller安裝方式,感興趣的朋友一起看看吧
    2021-12-12
  • python常見(jiàn)讀取語(yǔ)音的3種方法速度對(duì)比

    python常見(jiàn)讀取語(yǔ)音的3種方法速度對(duì)比

    python已經(jīng)支持WAV格式的書寫,下面這篇文章主要給大家介紹了關(guān)于python常見(jiàn)讀取語(yǔ)音的3種方法速度對(duì)比的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Python多線程編程threading模塊使用最佳實(shí)踐及常見(jiàn)問(wèn)題解析

    Python多線程編程threading模塊使用最佳實(shí)踐及常見(jiàn)問(wèn)題解析

    這篇文章主要為大家介紹了Python多線程編程threading模塊使用最佳實(shí)踐及常見(jiàn)問(wèn)題解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Python中處理表格數(shù)據(jù)的Tablib庫(kù)詳解

    Python中處理表格數(shù)據(jù)的Tablib庫(kù)詳解

    這篇文章主要介紹了Python中處理表格數(shù)據(jù)的Tablib庫(kù)詳解,Tablib 是一個(gè) MIT 許可的格式不可知的表格數(shù)據(jù)集庫(kù),用 Python 編寫,它允許您導(dǎo)入、導(dǎo)出和操作表格數(shù)據(jù)集,需要的朋友可以參考下
    2023-08-08
  • Python函數(shù)基礎(chǔ)

    Python函數(shù)基礎(chǔ)

    這篇文章主要從函數(shù)開(kāi)始介紹展開(kāi)Python函數(shù),以最基本的函數(shù)定義方法描述,需要的朋友可以參考下文簡(jiǎn)單的介紹
    2021-08-08
  • Django中模板的繼承及引用實(shí)現(xiàn)

    Django中模板的繼承及引用實(shí)現(xiàn)

    Django模版引擎中最強(qiáng)大也是最復(fù)雜的部分就是模版繼承了,頁(yè)面的代碼很多,隨隨便便就是幾百行代碼,但是每個(gè)頁(yè)面之中都有相同的元素。本文主要介紹了Django模板的繼承及引用,感興趣的可以了解一下
    2021-08-08
  • python求最大連續(xù)子數(shù)組的和

    python求最大連續(xù)子數(shù)組的和

    這篇文章主要介紹了python求最大連續(xù)子數(shù)組的和,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Python控制臺(tái)輸出俄羅斯方塊的方法實(shí)例

    Python控制臺(tái)輸出俄羅斯方塊的方法實(shí)例

    這篇文章主要給大家介紹了關(guān)于Python控制臺(tái)輸出俄羅斯方塊的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04

最新評(píng)論