2017-12-28 10 views
10

私はまだtensorflowの初心者です。私のモデルの訓練が進行している間、何が起こっているのかを理解しようとしています。簡単に言えば、モデルをImageNetにあらかじめ用意して、私のデータセットにfinetuningを実行しています。ここではいくつかのプロットは、2つの別々のモデルにtensorboardから抽出されています テンターボードプロットの解釈

InceptionV4

Model_1 (InceptionResnet_V2) 

Inception resnet V2

Model_2 (InceptionV4) 
これまでのところ、両方のモデルが悪いの検証セットの結果(平均アリゾナ(エリアの下に持っていますROC曲線)= Model_1 & 0.79 Model_2については0.7)。これらのプロットへの私の解釈は、重量がミニバッチで変化していないということです。それは、ミニバッチ上で変化するバイアスだけであり、これが問題である可能性があります。しかし、私はこの点を確認するためにどこを探すべきか分からない。これは私が考えることができる唯一の解釈ですが、まだ私が初心者であるという事実を考えると間違っているかもしれません。あなたの考えを私に教えてください。必要に応じて、もっと多くのプロットを求めることをためらってください。

EDIT:あなたは下記のプロットで見ることができるように 、重みがかろうじて時間の経過とともに変化しているようです。これは、両方のネットワークの他のすべての重みに適用されます。これはどこかに問題があると思うようになりましたが、それをどのように解釈するのか分かりません。

InceptionResnetV2 weights 

InceptionV4 weights

InceptionV4 weights 

InceptionResnetV2 weights

EDIT2: これらのモデルは、最初のImageNetに訓練されたとこれらのプロットは、私のデータセット上でそれらをfinetuningの結果です。私はそれに約800000のイメージを持つ19クラスのデータセットを使用しています。私はマルチラベル分類の問題を抱えており、私は損失関数としてsigmoid_crossentropyを使用しています。クラスは非常に不均衡です。

Objects  train  validation 
obj_1  3.9832 % 0.0000 % 
obj_2  70.6678 % 33.3253 % 
obj_3  89.9084 % 98.5371 % 
obj_4  85.6781 % 81.4631 % 
obj_5  92.7638 % 71.4327 % 
obj_6  99.9690 % 100.0000 % 
obj_7  90.5899 % 96.1605 % 
obj_8  77.1223 % 91.8368 % 
obj_9  94.6200 % 98.8323 % 
obj_10  88.2051 % 95.0989 % 
obj_11  3.8838 % 9.3670 % 
obj_12  50.0131 % 24.8709 % 
obj_13  0.0056 % 0.0000 % 
obj_14  0.3237 % 0.0000 % 
obj_15  61.3438 % 94.1573 % 
obj_16  93.8729 % 98.1648 % 
obj_17  93.8731 % 97.5094 % 
obj_18  59.2404 % 70.1059 % 
obj_19  8.5414 % 26.8762 % 

hyperparams値:

batch_size=32 
weight_decay = 0.00004 #'The weight decay on the model weights.' 
optimizer = rmsprop 
rmsprop_momentum = 0.9 
rmsprop_decay = 0.9 #'Decay term for RMSProp.' 

learning_rate_decay_type = exponential #Specifies how the learning rate is decayed 
learning_rate = 0.01 #Initial learning rate. 
learning_rate_decay_factor = 0.94 #Learning rate decay factor 
num_epochs_per_decay = 2.0 #'Number of epochs after which learning rate 

のスパース性について以下の表に、我々は、2つのサブセット(列車、バリデーション)内の各クラスの存在のパーセンテージを示していますここで層は、両方のネットワークのための層のスパース性のいくつかのサンプルです:

sparsity (InceptionResnet_V2) 

enter image description here

sparsity (InceptionV4) 

enter image description here

EDITED3:ここ は、両方のモデルのための損失のプロットである:

Losses and regularization loss (InceptionResnet_V2) 

enter image description here

Losses and regularization loss (InceptionV4) 

enter image description here

+0

私はRMSpropに詳しくは分かりませんが、それらのハイパーパラメータは私にとってうまく見えます。また、かなりの量のデータを持っています...私はauROCがバイアスされた分類の良い指標だと知っていますが、好奇心の中からTop-1か - 好ましくは - ** Top-5の精度**がありますか?実際の**損失値**のプロットはどうですか? –

+0

私の場合は、マルチラベルの分類であるため、1つの画像に19種類のクラスがあるため、Top-1またはTop-5として考えることはできません(マルチクラス分類)。私は損失プロットを追加しました – Maystro

+0

私の間違い、私は問題を誤解しました。損失のプロットをありがとう。 –

答えて

5

私はあなたの評価に同意しますメンバ - ミニバッチ全体でウェイトはあまり変化していません。彼らは変化しているように見える少し

あなたが知っていると思うように、非常に大きなモデルで微調整を行っています。そういうわけで、バックプロップに時には時間がかかることがあります。しかし、あなたは多くのトレーニング反復を実行しています。私は本当にこれが問題だとは思わない。

私が間違っていない場合、これらは両方とももともとImageNetで訓練されています。あなたのイメージがImageNetのものと全く異なるドメインにある場合、その問題を説明することができます。

backprop equationsは、特定のアクティベーション範囲でバイアスを変更しやすくします。モデルが非常に疎である場合(すなわち、多くの層が0の活性化値を有する場合、重みは調整するのに苦労するが、バイアスはそうではない)、ReLUは1になり得る。また、活性化が範囲[0, 1]にある場合、重みに関する勾配はバイアスに対する勾配よりも高くなる。 (これはシグモイドが悪い起動機能である理由です)。

また、読取り層、具体的にはアクティベーション機能に関連する可能性があります。どのようにエラーを計算していますか?これは分類や回帰の問題ですか?可能であれば、最終的な起動機能としてSigmoid以外のものを使用することをお勧めします。 tanhはほんの少し上手くいくかもしれません。線形読み出しは時には訓練をスピードアップすることもあります(すべての勾配は読み出し層を "通過"しなければなりません)。読み出し層の派生物が常に1 - 線形であれば、モデル)。

最後に、私はあなたの体重ヒストグラムが負の体重に向かっていることに気付きました。時々、特に多くのReLU活性化を有するモデルでは、モデル学習の希薄さの指標となることがあります。または、死んだニューロンの問題の指標。または両方とも、2つは多少リンクされています。

最終的には、あなたのモデルはちょうど勉強に苦しんでいると思います。私は、非常によく似たヒストグラムを作り直してInceptionに遭遇しました。私は約2000の画像のデータセットを使用していましたが、80%の精度でそれをプッシュしようと苦労していました(データセットは大きく偏っていました - その精度はランダムな推測とほぼ同じくらい良いものでした)。それは、畳み込み変数を一定にして、完全に接続されたレイヤーに変更を加えたときに役立ちました。


これは実際に分類問題であり、シグモイドクロスエントロピーが適切な起動関数です。そして、あなたはかなりのデータセットを持っています - これらのモデルを微調整するのに十分な大きさです。

この新しい情報では、私は初期学習率を低くすることをお勧めします。私はここで2倍の推論を持っています:

(1)は私自身の経験です。私が言及したように、私は特にRMSpropに精通していません。私はDNC(ただし、畳み込みコントローラを備えたDNC)のコンテキストでしか使用していませんが、ここでの私の経験は、私が言うことをバックアップしています。私は.01が最初からモデルを訓練するために高いと思うが、微調整はしない。それはアダムにとって確かに高いです。ある意味では、小さな学習率から始めることは、微調整の「細かい」部分です。体重をかなり大きくシフトさせないでください。特に、最後の(いくつかの)レイヤーではなくモデル全体を調整している場合。

(2)は、疎性が増し、負の重みにシフトしています。あなたのスパーシティプロット(良いアイデア btw)に基づいて、いくつかの重みが過補正の結果としてまばらな構成に詰まっているように見えます。すなわち、高い初期速度の結果として、ウェイトは最適位置を「オーバーシュート」し、どこかに詰まり、回復してモデルに寄与することが困難になる。つまり、ReLUネットワークでは、わずかに負でゼロに近い値は良くありません。

私が(繰り返し)言及したように、私はRMSpropにあまり慣れていません。しかし、既に多くのトレーニング反復を実行しているので、低い、低い、を低くしてください最初のショットはあなたの方法をアップします。つまり、1e-8の仕組みを見てください。モデルは、低いレートのトレーニングには反応しませんが、学習レートでの非公式のハイパーパラメータ検索の何かを行う可能性があります。 Adamを使った私の経験では、1e-41e-8がうまくいきました。

+0

あなたのコメントをありがとう、私は自分の質問を編集しました。 – Maystro

+0

@Maystro編集内容に基づいて編集します。お役に立てれば。 –

+0

ありがとう@DylanF私は1e-4の学習率で別のトレーニングを開始し、提案した学習率の範囲でadamオプティマイザを使用して別のトレーニングを開始します。私はいくつかの結果が得られるとすぐにあなたに戻ってきます。 – Maystro