mmdetection 項目過程問題總結

1、寫兩分支的時候無論batchsize多小,程序都會卡到動不了

問題在於,寫兩分支的時候loss更新沒寫好,loss每個分支都對同一個key值更新一遍,多次更新導致CPU和GPU信息傳遞的時候負擔太重。(CPU計算完梯度傳遞給GPU)

解決方法:把兩個分支得到的loss 的tensor先加起來再更新loss字典。


2、在mask rcnn的基礎上覆現panet的時候出現

RuntimeError: one of the variables needed for gradient computation has been modified by an inplace operation.

意思是在反向求梯度的時候,發現有個變量被人爲替換了。

通過觀察錯誤信息中變量的維度信息,確定錯誤發生在mask分支。

接下來,通過控制變量法逐漸鎖定錯誤位置。

下面是出錯部分的代碼:

for i in range(len(x)):
    x[i] = self.mask_conv1[i](x[i]) # 錯誤出在這一句
x = torch.max(x, dim=0)[0]
…………

在原來的代碼中,我把x矩陣裏面的每一行都進行了改變,而網絡在梯度求導時發現變量x內部發生了替換,會導致邏輯上出問題。

改正後代碼如下:

x_ = x.clone()
for i in range(len(x)):
    x_[i] = self.mask_conv1[i](x[i]) # 錯誤出在這一句
x_ = torch.max(x_, dim=0)[0]
…………

避開替換操作就好啦,完美解決問題。 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章