詳細報錯資訊如下:
關鍵錯誤為:
/pytorch/aten/src/ATen/native/cuda/Loss.cu:106: operator(): block: [73,0,0], thread: [30,0,0] Assertion
input_val >= zero && input_val <= one
failed.
THCudaCheck FAIL file=/pytorch/aten/src/THC/THCCachingHostAllocator.cpp line=278 error=710 : device-side assert triggered
除此之外還有一個錯誤資訊:
loss_base(b)=-inf
錯誤原因分析
-
錯誤定位:
網上大多數解決方案均是檢查标簽是否越界,如報錯資訊所知确實說的就是這個問題,有一些童鞋确實是标簽問題,但是也有不是的,比如我。另外我這裡還有一個額外的錯誤資訊就是報錯時的loss值為負無窮,這是不正确的,且必然會導緻程式出錯誤,我不知道标簽越界的那些同學是否有這個錯誤,至少我的有。是以經過排查,我并不是由于标簽越界導緻的,而是由于loss計算中的數學錯誤導緻的該錯誤資訊。
-
具體原因:
我的loss計算其中一個過程是這樣的:
而我在出現上述錯誤地方的loss值為-inf,也就是負無窮大,是以可知torch.log(torch.sum(F_loss))
的計算結果為0時,0的對數值為負無窮大,是以程式就出現了問題,就導緻了上述報錯。torch.sum(F_loss)
- 不過尚不知道為何這個數學問題為何會報這個錯誤資訊。
解決方法
為防止取對數的值為0,需要加一個接近0的值(如:1e-6)就可以了
例如:
torch.log(torch.sum(F_loss) + 1e-6)
另:還會報類似錯誤地其他問題
如:當在兩類别分割中,未在BCELoss前使用torch.sigmoid()輸出時也會報類似錯誤。
RuntimeError: CUDA error: device-side assert triggered
總結
基本上該類問題除了标簽值不正确外,可能大部分與loss計算有關,是以在寫代碼的過程還是要注意下細節,如還有其他不同的問題導緻這個錯誤,歡迎大家評論補充。