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]
…………
避開替換操作就好啦,完美解決問題。