2017-08-04 11 views
2

4つのクラスで小さなカスタム画像分類トレーニング/ valデータセットを構築しました。 トレーニングデータセットの画像は〜110.000です。 検証データセットには〜6.000個のイメージがあります。画像分類。開始時に訓練中に妥当性検査の詰まりがありました。(v1)

検証精度と損失が同じままながら、私が経験してる問題は、トレーニング中に、(最後の訓練サンプルの平均精度と測定された)トレーニング精度とトレーニング損失の両方を向上させる、ということです。

私はインポートすることにより、いくつかの畳み込みのアーキテクチャを採用しています私が創業し、resnetモデルを使用する場合にのみ、発生した私は、同じトレーニングと検証データにalexnetモデルを使用している場合、検証損失と精度が私の実験では

を改善それらは次のようコードが整理されtensorflow.contrib.slim.nets

から:

... 

images, labels = preprocessing(..., train=True) 
val_images, val_labels = preprocessing(..., train=False) 

... 

# AlexNet model 
with slim.arg_scope(alexnet.alexnet_v2_arg_scope()): 
    logits, _ = alexnet.alexnet_v2(images, ..., is_training=True) 
    tf.get_variable_scope().reuse_variables() 
    val_logits, _ = alexnet.alexnet_v2(val_images, ..., is_training=False) 

# Inception v1 model 
with slim.arg_scope(inception_v1_arg_scope()): 
    logits, _ = inception_v1(images, ..., is_training=True) 
    val_logits, _ = inception_v1(val_images, ..., is_training=False, reuse=True) 

loss = my_stuff.loss(logits, labels) 
val_loss = my_stuff.loss(val_logits, val_labels) 

training_accuracy_op = tf.nn.in_top_k(logits, labels, 1) 
top_1_op = tf.nn.in_top_k(val_logits, val_labels, 1) 
train_op = ... 

... 

代わりに、別のevalスクリプトを使用しての、私は各エポックの終わりに検証ステップを実行していると、ALSよo、デバッグの目的で、私は早いvalステップ(訓練の前に)を実行しています。最後のxステップで訓練の予測を平均化して訓練の精度をチェックしています。

IはインセプションV1モデル(alexnetいずれかをコメントアウト)を使用する場合、以下のようにロガー出力は1つのエポックの後である:

early Validation Step 
precision @ 1 = 0.2440 val loss = 1.39 
Starting epoch 0 
step 50, loss = 1.38, training_acc = 0.3250 
... 
step 1000, loss = 0.58, training_acc = 0.6725 
... 
step 3550, loss = 0.45, training_acc = 0.8063 
Validation Step 
precision @ 1 = 0.2473 val loss = 1.39 

示す、トレーニング精度と損失として1つのエポックの後に多くのことを改善するが、検証の損失はまったく変わりません。これは少なくとも10回テストされており、結果は常に同じです。オーバーフィットのために検証の損失が悪化していたのかどうかはわかりますが、この場合は全く変化していません。検証データに問題を除外するために

、私はまた、スリムでAlexNetの実装を使用してトレーニングしながら、結果を提示しています。 alexnetモデルを使用している場合、正しく改善、

early Validation Step 
precision @ 1 = 0.2448 val loss = 1.39 
Starting epoch 0 
step 50, loss = 1.39, training_acc = 0.2587 
... 
step 350, loss = 1.38, training_acc = 0.2919 
... 
step 850, loss = 1.28, training_acc = 0.3898 
Validation Step 
precision @ 1 = 0.4069 val loss = 1.25 

精度と検証の損失、両方のトレーニングとテストデータでは、彼らは、その後のエポックに維持向上:alexnetモデルとの訓練は、次の出力を生成します。

alexnetでトレーニングをするとき、私は、問題の原因である可能性があります理解していない、と開始/ resnetモデルを使用している場合、なぜそれが自分自身を提示し、なく。

アイデアはありますか?

答えて

0

フォーラムで検索し、さまざまなスレッドを読み込んで実験したところ、問題の根本が見つかりました。基本的には他の例からリサイクルされたtrain_opを使用して

が問題だった、それはalexnetモデルとうまく働いたが、それは、バッチ正規の更新を欠いていたので、他のモデルでは動作しませんでした。私はこれが行われているbatchnorm更新の世話をするようだ

optimizer = tf.train.GradientDescentOptimizer(0.005) 
train_op = slim.learning.create_train_op(total_loss, optimizer) 

または

train_op = tf.contrib.layers.optimize_loss(total_loss, global_step, .005, 'SGD') 

のいずれかを使用する必要がありました。この問題を解決するには

移動平均の更新が遅いため、短時間のトレーニングで問題は解決されませんでした。

デフォルトのスリムなarg_scopeでは、減衰が0.9997に設定されていましたが、これは安定していますが、収束させるためには多くの手順が必要です。同じarg_scopeを使用しても、0.99または0.9に設定された減衰を使用すると、この短いトレーニングシナリオで役立ちました。

0

検証ロスを計算するためにロジットを使用しているようです。予測を使用すると、役立つ可能性があります。

val_logits, _ = inception_v1(val_images, ..., is_training=False, reuse=True) 
val_logits = tf.nn.softmax(val_logits) 
+0

損失は、スケーリングされていないロジットを使用し、内部的にsoftmaxを実行するtf.nn.sparse_softmax_cross_entropy_with_logitsを使用して計算されます。 – user3897060

関連する問題