這段在使用caffe的時候遇到了兩個問題都是在訓練的過程中loss基本保持常數值,特此記錄一下。
loss等於87.33這個問題是在對inception-v3網路不管是fine-tuning還是train的時候遇到的,無論網路迭代多少次,網路的loss一直保持恆定。
查閱相關資料以後發現是由於loss的最大值由flt_min計算得到,flt_min是
1.17549435e−
38f 其對應的自然對數正好是-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 。
採用vgg-16在做乙個二分類問題,所以計算loss時等價與下面的公式: l
oss=
−log
(pk==
labe
l)當p=0.5時,loss正好為0.693147,也就是訓練過程中,無論如何調節網路都不收斂。最初的網路配置檔案卷積層的引數如下所示:
從vgg-16訓練好的模型進行fine-tuning也不發生改變,當在網路中加入初始化引數和decay_mult
以後再次訓練網路開始收斂。
但是具體是什麼原因造成的,暫時還沒有找到,難道是初始化引數的問題還是?
Caffe訓練過程
1.caffe入門學習 筆記 1 直接訓練法 usr bin env sh tools cafferead build tools tools caffe train solver gender solver.prorotxt gpu all 加入 gpu 選項 gpu 可以選擇gpu的id號,如果...
caffe訓練過程中,訓練中斷之後,如何接著訓練?
zxw.sh home tyn downloads center loss caffe build tools caffe train solver face solver.prototxt snapshot center loss model iter 9000.solverstate gpu a...
caffe訓練過程中的視覺化
import matplotlib.pyplot as plt import caffe caffe.set device 0 caffe.set mode gpu 使用sgdsolver,即隨機梯度下降演算法 solver caffe.sgdsolver home mnist solver.pro...