【解決方案】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。在網上查瞭解決方案,都很差用:python

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

試過上述方法,卻一樣無效的小夥伴能夠考慮:web

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

個人 target 計算公式,可能會獲得 inf 的結果,致使沒法正常的梯度降低。能夠考慮:函數

  • 檢查 target 是否正確;
  • 計算了 target 後,將其改成本身須要的值,以下。
target[target == float("Inf")] = 0

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