濮阳杆衣贸易有限公司

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

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

熱門標(biāo)簽:陜西金融外呼系統(tǒng) 哈爾濱ai外呼系統(tǒng)定制 海南400電話如何申請(qǐng) 公司電話機(jī)器人 騰訊外呼線路 唐山智能外呼系統(tǒng)一般多少錢 白銀外呼系統(tǒng) 激戰(zhàn)2地圖標(biāo)注 廣告地圖標(biāo)注app

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

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

CUDNN

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

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

不過實(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ù)的過程采用了隨機(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ì)有差異。

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

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

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

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ù)是不一致的,后來發(fā)現(xiàn)是pytorch版本的問題,將原先的0.3.1版本升級(jí)到1.1.0版本,問題解決

4.按照上面的操作后雖然解決了問題

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

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ò)誤或未考慮完全的地方,望不吝賜教。

您可能感興趣的文章:
  • 簡述python&pytorch 隨機(jī)種子的實(shí)現(xiàn)
  • Pytorch在dataloader類中設(shè)置shuffle的隨機(jī)數(shù)種子方式
  • pytorch通過訓(xùn)練結(jié)果的復(fù)現(xiàn)設(shè)置隨機(jī)種子

標(biāo)簽:益陽 惠州 鷹潭 四川 常德 黔西 黑龍江 上海

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PyTorch 如何設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)》,本文關(guān)鍵詞  PyTorch,如何,設(shè)置,隨機(jī)數(shù),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《PyTorch 如何設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)》相關(guān)的同類信息!
  • 本頁收集關(guān)于PyTorch 如何設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    建德市| 华阴市| 屏东市| 南陵县| 青冈县| 扎囊县| 奉节县| 博罗县| 繁昌县| 康乐县| 广州市| 延庆县| 南江县| 建平县| 永泰县| 瑞丽市| 关岭| 崇明县| 丰都县| 泾源县| 浮山县| 东光县| 额尔古纳市| 汉阴县| 盐源县| 南开区| 长岛县| 天峨县| 绥棱县| 昆山市| 屏东市| 绥江县| 乃东县| 商洛市| 樟树市| 保亭| 罗源县| 阳西县| 郸城县| 丁青县| 安龙县|