PyTorch 編寫代碼遇到的問題及解決方案_第1頁
PyTorch 編寫代碼遇到的問題及解決方案_第2頁
PyTorch 編寫代碼遇到的問題及解決方案_第3頁
PyTorch 編寫代碼遇到的問題及解決方案_第4頁
PyTorch 編寫代碼遇到的問題及解決方案_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

第PyTorch編寫代碼遇到的問題及解決方案RuntimeError:AttemptingtodeserializeobjectonCUDAdevice1buttorch.cuda.device_count()is1.Pleaseusetorch.loadwithmap_locationtomapyourstoragestoanexistingdevice.

或者是RuntimeError:expecteddevicecuda:0butgotdevicecuda:1

錯誤原因之一

使用了CUDA1顯卡訓(xùn)練保存的模型文件,使用CUDA0驗證

代碼中寫了

device=torch.device(“cuda”iftorch.cuda.is_available()else“cpu”)

可以在命令行設(shè)置讓哪些GPU可見

exportCUDA_VISIBLE_DEVICES=1#GPU編號

exportCUDA_VISIBLE_DEVICES=0,1,2,3#4張顯卡可見

也可以在代碼里改成

checkpoint=torch.load(checkpoint,map_location=‘cuda:0')

錯誤提示

raiseConnectionError(e,request=request)

requests.exceptions.ConnectionError:HTTPConnectionPool(host='localhost',port=8097):Maxretriesexceededwithurl:/update(CausedbyNewConnectionError('urllib3.connection.HTTPConnectionobjectat0x7f3111915e80:Failedtoestablishanewconnection:[Errno111]Connectionrefused',))

Exceptioninusercode:

因為沒有啟動visdom可視化程序,所有報錯

在終端執(zhí)行命令visdom之后就能看到如下信息

Checkingforscripts.

It'sAlive!

INFO:root:ApplicationStarted

Youcannavigatetohttp://localhost:8097

nn.Module.cuda()和Tensor.cuda()

無論是對于模型還是數(shù)據(jù),cuda()都能實現(xiàn)從CPU到GPU的內(nèi)存遷移,但是他們的作用效果有所不同。

Model:

model=model.cuda()

model.cuda()

上面兩句能夠達(dá)到一樣的效果,即對model自身進(jìn)行的內(nèi)存遷移

Tensor:

model=Model()

tensor=torch.zeros([2,3,10,10])

model.cuda()

tensor.cuda()

tensor_cuda=tensor.cuda()

model(tensor)#會報錯

model(tensor_cuda)#正常運行

和nn.Module不同,調(diào)用tensor.cuda只是返回這個tensor對象在GPU內(nèi)存上的拷貝,而不會對自身進(jìn)行改變。因此必須對tensor進(jìn)行重新賦值,即tensor=tensor.cuda()

PyTorch0.4計算累積損失的不同

以廣泛使用的模式total_loss+=loss.data[0]為例。Python0.4.0之前,loss是一個封裝了(1,)張量的Variable,但Python0.4.0的loss現(xiàn)在是一個零維的標(biāo)量。對標(biāo)量進(jìn)行索引是沒有意義的(似乎會報invalidindextoscalarvariable的錯誤)。使用loss.item()可以從標(biāo)量中獲取Python數(shù)字。所以改為:

total_loss=total_loss+loss.item()

如果在累加損失時未將其轉(zhuǎn)換為Python數(shù)字,則可能出現(xiàn)程序內(nèi)存使用量增加的情況。這是因為上面表達(dá)式的右側(cè)原本是一個Python浮點數(shù),而它現(xiàn)在是一個零維張量。因此,總損失累加了張量和它們的梯度歷史,這可能會產(chǎn)生很大的autograd圖,耗費內(nèi)存和計算資源。

自適應(yīng)CPU和GPU設(shè)備的trick

device=torch.device("cuda"iftorch.cuda.is_available()else"cpu")

model=Model().to(device)

total_loss=0

forinput,targetintrain_loader:

input,target=input.to(device),target.to(device)

total_loss=total_loss+loss.item()

withtorch.no_grad():

forinput,targetintest_loader:

torch.Tensor.detach的使用

官方說明:ReturnsanewTensor,detachedfromthecurrentgraph,Theresultwillneverrequiregradient

假設(shè)有模型A和模型B,我們需要將A的輸出作為B的輸入,但訓(xùn)練時我們只訓(xùn)練模型B.那么可以這樣做:

input_B=output_A.detach

它可以使兩個計算圖的梯度傳遞斷開,從而實現(xiàn)我們所需的功能。

pytorch中l(wèi)oss函數(shù)的參數(shù)設(shè)置

以CrossEntropyLoss為例:

CrossEntropyLoss(self,weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='elementwise_mean')

若reduce=False,那么size_average參數(shù)失效,直接返回向量形式的loss,即batch中每個元素對應(yīng)的loss.

若reduce=True,那么loss返回的是標(biāo)量:

如果size_average=True,返回loss.mean.

如果size_average=False,返回loss.sum.

weight:輸入一個1D的權(quán)值向量,為各個類別的loss加權(quán),如下公式所示:

ignore_index:選擇要忽視的目標(biāo)值,使其對輸入梯度不作貢獻(xiàn)。如果size_average=True,那么只計算不被忽視的目標(biāo)的loss的均值。

reduction:可選的參數(shù)有:‘none'|‘elementwise_mean'|‘sum',正如參數(shù)的字面意思。

多GPU的處理機(jī)制

使用多GPU時,應(yīng)該記住PyTorch的處理邏輯是:

在各個GPU上初始化模型。

前向傳播時,把batch分配到各個GPU上進(jìn)行計算。

得到的輸出在主GPU上進(jìn)行匯總,計算loss并反向傳播,更新主GPU上的權(quán)值。

把主GPU上的模型復(fù)制到其它GPU上。

訓(xùn)練時損失出現(xiàn)nan的問題

訓(xùn)練模型時出現(xiàn)損失為nan的情況

可能導(dǎo)致梯度出現(xiàn)nan的三個原因:

梯度爆炸。也就是說梯度數(shù)值超出范圍變成nan.通??梢哉{(diào)小學(xué)習(xí)率、加BN層或者做梯度裁剪來試試看有沒有解決。

損失函數(shù)或者網(wǎng)絡(luò)設(shè)計。比方說,出現(xiàn)了除0,或者出現(xiàn)一些邊界情況導(dǎo)致函數(shù)不可導(dǎo),比方說log(0)、sqrt(0).

臟數(shù)據(jù)??梢允孪葘斎霐?shù)據(jù)進(jìn)行判斷看看是否存在nan.

補(bǔ)充一下nan數(shù)據(jù)的判斷方法:

注意!像nan或者inf這樣的數(shù)值不能使用==或者is來判斷!為了安全起見統(tǒng)一使用math.isnan或者numpy.isnan吧。

importnumpyasnp

ifnp.any(np.isnan(input.cpu().numpy())):

print("InputdatahasNaN!")

if(np.isnan(loss.item())):

print("LossvalueisNaN!")

pytorch內(nèi)存泄漏

torch.as_tensor(data,dtype=None,device=None)-Tensor:為data生成tensor。

如果data已經(jīng)是tensor,且d

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論