2015-10-20 21 views
8

Caffeでマルチラベル分類を行うようにGoogLeNetを微調整したいと思います。私はすでに単一ラベルの分類に微調整していますが、まだマルチラベルに移行することはできません。異なっている私がやっているCaffeによるマルチラベル分類

主な手順:

データ用LMDBを作成&グランドトゥルース

私がデータを使用した1 LMDBを作成するためのコードherehereを修正していますし、グランドトゥルースと他の。 train_val.prototxtを更新SigmoidCrossEntropyLoss

でSoftmaxWithLossの交換

は、私がSigmoidCrossEntropyLossにSoftmaxWithLoss層を交換し、両方のDBのがロードされるように、データ層を設定します。私は単ラベル分類問題で行ったように、学習率パラメータを設定しました。

この手順は機能しているようです。データの流れで、solver.step(1)を実行することができます。データとラベルが正しくロードされていることを確認するために、私は式を使って明示的に損失を計算し、Caffeと同じ結果を得ました。

問題

ネットワークが収束しません。それを繰り返し実行すると、各クラスは平均してクラス人口の周りにいます。すなわち、クラスaが母集団中に0.35 1および0.65 0を有する場合、ネットワークは真のラベルにかかわらず、各観測について〜0.35分類確率に収束する。

可能性のあるエラー1

私はGoogLeNet pretrainedモデルは、彼らから学ぶことができるような方法で正しくカフェに画像をロードするために失敗するため、問題があると思います。これまでの私の経験は完全に動作するconvert_imagesetです。今、私はLMDBに画像を保存するためにshelhamerコードを使用しています:画像をロードするときに

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を切り替える以外に必要なことはありますか?

ご協力いただきますようお願い申し上げます。 ありがとう! GoogLeNet入力データで

+2

「すべて1」の予測で立ち往生あなたのネットのように思えます。グラデーションが高すぎて無意味な領域にパラメータを移動させた場合に起こります。トレーニングの損失と反復回数のグラフをプロットできますか?私は学習率を1または2 *のオーダーで減らしてみようと思います。そして、モデルが再び立ち往生したかどうかを見直してみてください。 – Shai

+1

ネットワークが収束していない場合は、学習率を確認する必要があります。一般的に、微調整のためには、学習率が低い(または、高い学習率から始まり、急速に減衰する)必要があります。列車の損失がエポックを超えて増加している場合は、学習率が高すぎることを示しています。 – user3334059

+0

この問題をお持ちですか? https://github.com/BVLC/caffe/issues/2407 – ginge

答えて

0

は平均値で減算する必要があります。

... 
im = im.transpose((2,0,1)) 
mean = np.array((104,117,123)) 
im -= mean 
im_dat = caffe.io.array_to_datum(im) 
... 
関連する問題