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
。
試過上述方法,卻同樣無效的小夥伴可以考慮:
- 自己手寫
loss function
,在臨界值處改爲線性函數,知乎鏈接:【PyTorch】梯度爆炸、loss在反向傳播變爲nan; - 或者參考我下面的方案。
這裏我觀察了臨界值,打了90分鐘的print
,發現我的問題出在target
上。
我的 target 計算公式,可能會得到 inf 的結果,導致無法正常的梯度下降。可以考慮:
- 檢查
target
是否正確; - 計算了
target
後,將其改爲自己需要的值,如下。
target[target == float("Inf")] = 0
但請注意該方法在數學上的可行性。