您好,登錄后才能下訂單哦!
本篇文章為大家展示了怎么在PyTorch中設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn),內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。
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ì)算效率降低。
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ī)種子
如果讀取數(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采用了多線程(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ò)的坑
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)
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)
但是仍然有些數(shù)據(jù)是不一致的,后來(lái)發(fā)現(xiàn)是pytorch版本的問(wèn)題,將原先的0.3.1版本升級(jí)到1.1.0版本,問(wèn)題解決
但是由于將cudnn.benchmark設(shè)置為False,運(yùn)行速度降低到原來(lái)的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)
1.PyTorch是相當(dāng)簡(jiǎn)潔且高效快速的框架;2.設(shè)計(jì)追求最少的封裝;3.設(shè)計(jì)符合人類思維,它讓用戶盡可能地專注于實(shí)現(xiàn)自己的想法;4.與google的Tensorflow類似,F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開發(fā)更新;5.PyTorch作者親自維護(hù)的論壇 供用戶交流和求教問(wèn)題6.入門簡(jiǎn)單
上述內(nèi)容就是怎么在PyTorch中設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。