2015-10-20 89 views
8

我想微調GoogLeNet以使用Caffe進行多標籤分類。我已經將其精細調整爲單標籤分類,但我無法過渡到多標籤。使用Caffe的多標籤分類

我做的主要步驟,這是不同的:

爲數據創建LMDB &地面實測

我修改代碼herehere創建一個LMDB用數據和其他與地面實況。

與SigmoidCrossEntropyLoss

更換SoftmaxWithLoss更新train_val.prototxt,我取代SoftmaxWithLoss層SigmoidCrossEntropyLoss,並設置使得兩個DB的加載的數據層。我按照我對單標籤分類問題所做的那樣設置了學習速率參數。

這個步驟似乎工作。數據流,並且可以執行solver.step(1)。爲了驗證數據和標籤是否正確加載,我使用公式計算了損失,並得到與Caffe相同的結果。

問題

網絡不收斂。運行幾次迭代,不同班級的平均班級數量均爲平均值。這就是說,如果類別a在人口中的0.35 1和0.65 0,則每個觀察的網絡將收斂到〜0.35的分類概率,而不管真實標籤如何。

可能出現的錯誤1

我懷疑的問題是,因爲我無法將圖像加載到正確的朱古力的方式GoogLeNet預訓練的模型可以向他們學習。我迄今爲止的經驗是convert_imageset,它完美地工作。現在,我使用shelhamer代碼將圖像保存到LMDB:

im = np.array(Image.open(os.path.join(data_dir,in_))) 
im = im[:,:,::-1] 
im = im.transpose((2,0,1)) 
im_dat = caffe.io.array_to_datum(im) 
in_txn.put('{:0>10d}'.format(in_idx), im_dat.SerializeToString()) 

我在數據層加載圖像時正常化的平均值。 這看起來合適嗎?還有另一種方法可以做到嗎?

可能的錯誤2

也可能是該train_val.prototxt已經定義錯誤。除了切換SoftmaxWithLoss - > SigmoidCrossEntropyLoss之外,還有什麼需要做的嗎?

任何幫助將不勝感激! 謝謝!

+2

這似乎是你的網陷與「全1」的預測。如果你的梯度太高,可能會導致參數變成無意義的區域。你可以繪製一個訓練損失與迭代次數的關係圖嗎?我會嘗試將學習速度降低一個或兩個*數量級*並重新訓練,看看模型是否再次卡住。 – Shai

+1

如果你的網絡不收斂,你應該檢查學習速率。一般來說,對於微調,你應該有一個較低的學習速度(或高開始學習速度和快速衰減)。如果火車的損失在不同時期增加,這表明你的學習率太高。 – user3334059

+0

你見過這個問題嗎? https://github.com/BVLC/caffe/issues/2407 – ginge

回答

0

在GoogLeNet輸入數據應該由平均值減去:

... 
im = im.transpose((2,0,1)) 
mean = np.array((104,117,123)) 
im -= mean 
im_dat = caffe.io.array_to_datum(im) 
...