解決Caffe訓練過程中loss不變問題
1.loss等於87.33不變
loss等於87.33這個問題是在對Inception-V3網路不管是fine-tuning還是train的時候遇到的,無論網路迭代多少次,網路的loss一直保持恆定。
查閱相關資料以後發現是由於loss的最大值由FLT_MIN計算得到,FLT_MIN是-87.3356
,這也就對應上了loss保持87.3356了。
這說明softmax在計算的過程中得到了概率值出現了零,由於softmax是用指數函式計算的,指數函式的值都是大於0的,所以應該是計算過程中出現了float溢位的異常,也就是出現了inf,nan等異常值導致softmax輸出為0.
當softmax之前的feature值過大時,由於softmax先求指數,會超出float的資料範圍,成為inf。inf與其他任何數值的和都是inf,softmax在做除法時任何正常範圍的數值除以inf都會變成0.然後求loss就出現了87.3356的情況。
解決辦法
由於softmax輸入的feature由兩部分計算得到:一部分是輸入資料,另一部分是各層的權值等組成
減小初始化權重,以使得softmax的輸入feature處於一個比較小的範圍
降低學習率,這樣可以減小權重的波動範圍
如果有BN(batch normalization)層,finetune時最好不要凍結BN的引數,否則資料分佈不一致時很容易使輸出值變得很大(注意將
batch_norm_param
use_global_stats
設定為false
)。觀察資料中是否有異常樣本或異常label導致資料讀取異常
本文遇到的情況採用降低學習率的方法,learning rate設定為0.01或者原來loss的
1/5 或者1/10 。
2.loss保持0.69左右
採用VGG-16在做一個二分類問題,所以計算loss時等價與下面的公式:
當p=0.5時,loss正好為0.693147,也就是訓練過程中,無論如何調節網路都不收斂。最初的網路配置檔案卷積層的引數如下所示:
從VGG-16訓練好的模型進行fine-tuning也不發生改變,當在網路中加入初始化引數和decay_mult
但是具體是什麼原因造成的,暫時還沒有找到,難道是初始化引數的問題還是?