Caffeでマルチラベル分類を行うようにGoogLeNetを微調整したいと思います。私はすでに単一ラベルの分類に微調整していますが、まだマルチラベルに移行することはできません。異なっている私がやっているCaffeによるマルチラベル分類
主な手順:
データ用LMDBを作成&グランドトゥルース
私がデータを使用した1 LMDBを作成するためのコードhereとhereを修正していますし、グランドトゥルースと他の。 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入力データで
「すべて1」の予測で立ち往生あなたのネットのように思えます。グラデーションが高すぎて無意味な領域にパラメータを移動させた場合に起こります。トレーニングの損失と反復回数のグラフをプロットできますか?私は学習率を1または2 *のオーダーで減らしてみようと思います。そして、モデルが再び立ち往生したかどうかを見直してみてください。 – Shai
ネットワークが収束していない場合は、学習率を確認する必要があります。一般的に、微調整のためには、学習率が低い(または、高い学習率から始まり、急速に減衰する)必要があります。列車の損失がエポックを超えて増加している場合は、学習率が高すぎることを示しています。 – user3334059
この問題をお持ちですか? https://github.com/BVLC/caffe/issues/2407 – ginge