1. 程式人生 > >caffe訓練CNN時,loss不收斂原因分析

caffe訓練CNN時,loss不收斂原因分析

人工智慧/機器學習/深度學習交流QQ群:811460433

也可以掃一掃下面二維碼加入微信群,如果二維碼失效,可以新增博主個人微信,拉你進群

1. 資料和標籤

資料分類標註是否準確?資料是否乾淨?

另外博主經歷過自己建立資料的時候資料標籤設定為1,2,...,N,訓練的時候最後FC層設定的輸出output num為N。訓練的時候loss一直不降。後來將標籤改為0,1,2,...,N-1,重新訓練,很快就收斂了。

為啥label需要從0開始?

在使用SoftmaxLoss層作為損失函式層的單標籤分類問題中,label要求從0開始,例如1000類的ImageNet分類任務,label的範圍是0~999。這個限制來自於Caffe的一個實現機制,label會直接作為陣列的下標使用,具體程式碼SoftmaxLoss.cpp中133行和139行的實現程式碼。

這裡寫圖片描述

132行第一層for迴圈中的outer_num等於batch size,對於人臉識別和影象分類等單標籤分類任務而言,inner_num等於1。如果label從1開始,會導致bottom_diff陣列訪問越界。 

在標籤正確的前提下,如果倒數第一個全連線層num_output > 實際的類別數,Caffe的訓練是否會報錯?答案:不會報錯且無影響。 

2. 學習率設定

base_lr這個引數在自己訓練新網路時,可以從0.1開始嘗試,如果loss不下降的意思,那就降低,除以10,用0.01嘗試,一般來說0.01會收斂,不行的話就用0.001. 另外整個訓練過程中學習率是可變的,可以在solver檔案中指定學習率的變化規則。如:

# The base learning rate, momentum and the weight decay of the network.
base_lr: 0.01
momentum: 0.9
weight_decay: 0.0005

# The learning rate policy
lr_policy: "inv"
gamma: 0.0001
power: 0.75

引用一張圖來說明學習率設定對訓練的影響:

3. 網路設定不合理

如果做很複雜的分類任務,卻只用了很淺的網路,可能會導致訓練難以收斂。