訓練網路出現loss為NaN的情況

2021-08-25 16:41:10 字數 1905 閱讀 5405

原因:在學習過程中,梯度變得非常大,使得學習的過程偏離了正常的軌跡。

症狀:觀察輸出日誌中每次迭代的loss值,發現loss隨著迭代有明顯的增長,最後因為loss值太大以致於不能用浮點數去表示,所以變成nan。

可採取的方法:1.降低學習率,比如solver.prototxt中base_lr,降低乙個數量級。如果在你的模型中有多個loss層,就不能降低基礎的學習率base_lr,而是需要檢查日誌,找到產生梯度**的層,然後降低train_val.prototxt中該層的loss_weight。

原因:在學習過程中,caffe不能得出乙個正確的學習率,相反會得到inf或者nan的值,這些錯誤的學習率乘上所有的梯度使得所有的引數變成無效的值。

症狀:觀察輸出日誌,可以看到學習率變為nan

可採取的方法:修改solver.prototxt檔案中所有能影響學習率的引數。比如,如果你設定的學習率策略是 lr_policy: 「poly」 ,而你又忘了設定最大迭代次數max_iter,那麼最後你會得到lr=nan…

關於caffe學習率及其策略的內容,可以在github的/caffe-master/src/caffe/proto/caffe.proto 檔案中看到傳送門

原因:有時,在損失層計算損失值時會出現nan的情況。比如,像infogainloss層沒有歸一化輸入值,使用自定義的損失層等。

症狀:觀察輸出日誌的時候,可能不會發現任何異常:loss逐漸下降,然後突然出現nan。

可採取的方法:嘗試重現該錯誤,列印損失層的值並除錯。

舉個例子:根據批量資料中標籤出現的頻率去歸一化懲罰值並以此計算loss。如果有個label並沒有在批量資料中出現,頻率為0,結果loss出現了nan的情況。在這種情況下,需要用足夠大的batch來避免這個錯誤。

原因:你的輸入中存在nan

症狀:一旦學習過程中碰到這種錯誤的輸入,輸出就會變成nan。觀察輸出日誌的時候,可能不會發現任何異常:loss逐漸下降,然後突然出現nan。

可採取的方法:重新建立你的輸入資料集,確保你的訓練集、驗證集中沒有髒資料(錯誤的檔案)。除錯時,使用乙個簡單的網路去讀取輸入,如果有乙個輸入的錯誤,這個網路的loss也會出現nan。

由於一些原因,步長stride>核尺寸kernel_size的pooling層會出現nan。比如:

layer

}

結果y會出現nan。

問題

在linux虛擬機器上跑,同樣的**不會出現nan的情況。

訓練的結果

train output:表示訓練時網路的最後一層輸出,即logits,取值在0~1之間,表示1+4+16=21個cu劃分的概率。

valid output:表示驗證時網路的最後一層輸出,可以看出,包含0值。

嘗試

1.程式中輸入x表示殘差,數值較小,在正負10以內,進行歸一化處理之後,乘10進行數值擴大;

沒有效果

2.程式中valid資料集跟train資料集是一樣的,更換valid資料集;

沒有效果

結果

**沒有問題,資料集也沒有問題,雲伺服器可能是讀不到資料,== 最近公司在公升級,經常出故障。emmmm

loss訓練時的不下降 nan或者為0

1 loss不下降 2 檢測中faster rcnn的loss是nan 大部分是座標越界造成的 3 檢測中faster rcnn的bbox loss為0,主要是因為fg太少,遇到過第一階段的rois中,假設batch size是128,得到fg bg 1 127,很可能bbox loss等於0,因為...

深度學習loss出現NAN的原因分析

最近寫model出現了一些nan的問題,總結一下 1.我用的gan網路做推薦,g model 中的pred需要用 self.prob tf.clip by value tf.nn.sigmoid self.score 1e 5,1 處理一下,不然score可能為0,在cross entropy與po...

深度學習網路訓練中出現loss函式為nan的原因

說法一 說明訓練不收斂了,學習率太大,步子邁的太大導致梯度 等都是有可能的,另外也有可能是網路的問題,網路結構設計的有問題。我現在的採用方式是 1.弱化場景,將你的樣本簡化,各個學習率等引數採用典型配置,比如10萬樣本都是同一張複製的,讓這個網路去擬合,如果有問題,則是網路的問題。否則則是各個引數的...