【解決方案】pytorch中loss變成了nan | 神經網絡輸出nan | MSE 梯度爆炸/梯度消失

loss_func = nn.MSELoss()
loss = loss_func(val, target)

最近在跑一個項目,計算loss時用了很普通的MSE,在訓練了10到300個batch時,會出現loss tensor([[nan nan nan nan]]類似的情況。對這個異常的loss進行梯度下降,會導致net的輸出變爲nan。在網上查瞭解決方案,都不好用:

  • 學習率過大;
  • loss過小(或者說除以了0 / 計算了 log(0));
  • 存在髒數據輸入NaN

試過上述方法,卻同樣無效的小夥伴可以考慮:

這裏我觀察了臨界值,打了90分鐘的print,發現我的問題出在target上。

我的 target 計算公式,可能會得到 inf 的結果,導致無法正常的梯度下降。可以考慮:

  • 檢查 target 是否正確;
  • 計算了 target 後,將其改爲自己需要的值,如下。
target[target == float("Inf")] = 0

但請注意該方法在數學上的可行性。

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