在模型的訓練過程中發現,有時在經過多輪訓練後loss會突然變為nan。loss變為nan也就使權重更新後的網路裡的引數變為了nan,這樣就使整個訓練無法再進行下去了。
從除錯情況來看nan出現的順序是:loss的梯度 --> 網路的引數 --> **的結果 --> loss本身。
注意,第乙個出現問題的應該是loss的梯度。
一般sqrt函式的定義域為:[0,無窮大)
torch.sqrt()的定義域為:(0,無窮大)
因此,當開方的數非常小的時候反向傳播無法正常進行。可以通過給其加乙個非常小的數來避免該問題
torch.sqrt(x)--
> torch.sqrt(x +1e-
8)
很有可能是這個原因造成的。實際操作的將其修改後再也沒有出現過nan,說明這個問題很明顯。
眾所周知,log函式在x接近於0的時候輸出會接近於無窮小。因此,當絕對差很小的時候,log loss無法正常反向傳播。因此需要對log裡的x進行擷取clip。
假如在搜尋空間中有一堵「牆」,那麼當梯度下降撞到牆上時可能會得到乙個異常的的梯度,這就是梯度**現象。
當遇到梯度**時,只需要對梯度進行剪裁即可:
loss.backward(
)torch.nn.utils.clip_grad_norm(net.parameters(),
5)#設定剪裁閾值為5
雖然說這是乙個很低階的失誤, 但是有時候可能就是因為沒有發現這個低階失誤要檢查很久.(血流教訓)
ps:我會在這裡持續更新我遇到的產生nan的原因.
的訓練過程 模型訓練過程中累計auc
在平時計算auc的時候,大都是使用 sklearn.metrics.roc auc score 來計算。一般操作是將每個batch 出來的結果 拼接起來,然後扔到該函式中計算。但是如果測試集量級過大 比如 10億量級 每個樣本的 結果拼接起來之後至少需要 3g記憶體。這個開銷顯然不是我們想要的。有什...
訓練過程中出現的報錯
這個報錯是由於numpy的版本問題,伺服器電腦的numpy是1.13.1的,需要降到1.11.0 檢視本機numpy版本 python c import numpy print numpy.version.version sudo pip install u numpy 1.11.0能自動將之前安裝...
軟體測試過程中產生的文件
軟體測試是軟體開發的乙個重要環節,同時也是軟體質量保證的乙個重要環節。所謂測試就是用已知的輸入在已知環境中動態地執行系統 或系統的部件 測試一般包括單元測試 模組測試 整合測試和系統測試。如果測試結果與預期結果不一致,則很可能是發現了系統中的錯誤,測試過程中將產生下述基本文件 1 測試計畫 確定測試...