天天看點

Pytorch中常見的報錯解決方案

本文用于記錄所在pytorch所遇到過的運作時錯誤,持續更新。

  1. 變量所在裝置(CPU,GPU)不一緻問題
RuntimeError: Input type (torch.cuda.FloatTensor) and weight type (torch.FloatTensor) should be the same

可能原因:現在假設代碼要在GPU上運作,并且你已經進行

my_model.to(device)

操作了。注意隻有

my_model

中的屬性(也就是

self.

開頭的變量)才會進行

.to(device)

。如果出現這個錯誤,可能是有的中間變量需要手動再顯式地

.to(device)

一下~

  1. 在Conv2d中padding或stride的參數個數錯誤的問題
RuntimeError: expected padding to be a single integer value or a list of 1 values to match the convolution dimensions, but got padding=[0, 0]

原因一:

對于一張二維圖檔來說,它的padding也是二維的,即橫、縱方向上都需要設定padding(當然這兩個數字一般是一樣的)。現在為什麼提示我們padding應該是一維的呢?一定是輸入資料次元不對。

對于

Conv2d()

來說,它要求的輸入的形狀是四維的 ( N , C i n , H , W ) (N,C_{in},H,W) (N,Cin​,H,W),其中四個變量分别代表batch數、channel數、圖像高度和圖像寬度。當你從一個dataset中取出單幅圖檔時容易發生丢掉batch次元這個問題,即 ( 1 , C i n , H , W ) (1,C_{in},H,W) (1,Cin​,H,W)的tensor變成了 ( C i n , H , W ) (C_{in},H,W) (Cin​,H,W)的tensor,這時候我們隻需要對這個tensor(設為

x

)執行

x = x.unsqueeze(0)

增加一維就行了。

原因二:

上面說的是最可能的情況,如果你發現圖檔已經是四維的卻還有這個報錯,請檢查你Conv2d()的輸入參數。

例如,如果你把stride設定為一維的

[3]

而不是二維

3

(注意

3

會被自動處理成

[3, 3]

),同時padding為二維的

pytorch發現stride是一維的,而padding卻是二維的,就會報錯。

  1. inplace operation問題
one of the variables needed for gradient computation has been modified by an inplace operationone of the variables needed for gradient computation has been modified by an inplace operation

inplace操作可能會使得backward無法進行(因為目前Tensor可能會在另一個地方被用到),比如forward出現了如下代碼:

x += y
           

你可能需要該成:

x = x + y
           

繼續閱讀