pytorch中的細節問題

2021-09-25 03:18:01 字數 1848 閱讀 3605

1 nn.module.cuda() 和 tensor.cuda() 的作用效果差異:

對於nn.module:

model = model.cuda()

model.cuda()

上述兩句能夠達到同樣的效果,即對model自身進行記憶體遷移

2 對於tensor:

nn.module不同,呼叫tensor.cuda()只是返回這個tensor物件在gpu記憶體上的拷貝,而不會對自身進行改變

因此必須對tensor進行重新賦值,即tensor=tensor.cuda()

model = create_a_model()

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

model.cuda()

tensor.cuda()

model(tensor) # 會報錯

tensor = tensor.cuda()

model(tensor) # 正常執行

3 pytorch計算累積損失的不同

廣泛使用的模式total_loss += loss.data[0]為例

python0.4.0之前,loss是乙個封裝了(1,)張量的variable,但python0.4.0的loss現在是乙個零維的標量。

對標量進行索引是沒有意義的(似乎會報 invalid index to scalar variable 的錯誤)。

使用loss.item()可以從標量中獲取python數字。所以改為total_loss += loss.item()

如果在累加損失時未將其轉換為python數字,則可能出現程式記憶體使用量增加的情況。

這是因為上面表示式的右側原本是乙個python浮點數,而它現在是乙個零維張量。

因此,總損失累加了張量和它們的梯度歷史,這可能會產生很大的autograd 圖,耗費記憶體和計算資源

4 torch.tensor.detach()的使用

假設有模型a和模型b,我們需要將a的輸出作為b的輸入,但訓練時我們只訓練模型b. 那麼可以這樣做:

input_b = output_a.detach()

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

5 pytorch中loss函式的引數設定

參考博文鏈結位址

6 pytorch的可重複性問題

參考博文鏈結位址

7多gpu處理機制

使用多gpu時,應該記住pytorch的處理邏輯是:

1.在各個gpu上初始化模型。

2.前向傳播時,把batch分配到各個gpu上進行計算。

3.得到的輸出在主gpu上進行彙總,計算loss並反向傳播,更新主gpu上的權值。

4.把主gpu上的模型複製到其它gpu上

8 num_batches_tracked引數

keyerror: 『unexpected key 「module.bn1.num_batches_tracked」 in state_dict』

經過研究發現,在pytorch 0.4.1及後面的版本裡,batchnorm層新增了num_batches_tracked引數,用來統計訓練時的forward過的batch數目,原始碼如下(pytorch0.4.1)

引數和訓練時的歸一化的計算方式有關。

因此,我們可以知道該錯誤是由於訓練和測試所用的pytorch版本(0.4.1版本前後的差異)不一致引起的。具體的解決方案是:如果是模型引數(orderdict格式,很容易修改)裡少了num_batches_tracked變數,就加上去,如果是多了就刪掉。偷懶的做法是將load_state_dict的strict引數置為false,如下所示:

load_state_dict(torch.load(weight_path), strict=false)

Lego LOAM中的細節問題

節點 featureassociation 發布了雷達里程計,frame id為 laser odom,10hz 節點 transformfusion 訂閱了來自上述兩個節點的里程計topic,融合計算,發布最終的里程計,frame id為 camera,10hz 以上3個 tf 資訊流,其 par...

開發中遇到的細節問題

在androidmanifest.xml中新增了read phone state許可權,可是手機上一直報錯 問題產生原因 android6.0以上版本 編譯環境 targetsdkversion 23 沒做許可權的請求處理 android 6.0以上增加了動態獲取許可權api,不做處理會報錯。解決辦...

boost編譯中的細節問題

生成檔案命名規則 boost中有許多庫,有的庫需要編譯 而有的庫不需要編譯,只需包含標頭檔案就可以使用。編譯生成的檔案名字普遍較長,同乙個庫根據編譯鏈結選項不同,又可以生成多個不同名字的檔案。生成的檔案名字是很長,可是這樣帶的資訊才多,也就容易識別出用途。其實生成檔案的名字遵循一定的規則,有著固定的...