2017-08-04 48 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個步驟的訓練預測進行平均來檢查訓練的準確性。

當我使用盜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 

如圖所示,訓練精度和損失提高很多一個曆元之後,但驗證損失完全沒有改變。這已經過至少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模型時正確地改進,他們保持在隨後的時期提高。

我不明白是什麼可能是問題的原因,以及爲什麼它使用開始/ RESNET模型時,但alexnet訓練的時候不提出了自己。

有沒有人有想法?

回答

0

通過搜索論壇,閱讀各種線程和試驗後,我發現問題的根源。

使用這是基本上是從另一個例子再生一個train_op是問題,它與alexnet模式運作良好,但由於它是缺乏批標準化更新其他型號沒有工作。

爲了解決這個問題,我不得不爲使用

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') 

這似乎採取batchnorm更新的護理正在做。

由於緩慢移動的平均值更新,短期訓練運行仍然存在問題。

默認苗條arg_scope的衰減設置爲0.9997,這是穩定的,但顯然需要很多步驟來收斂。使用相同的arg_scope,但將衰減設置爲0.99或0.9,在此短期培訓場景中確實有所幫助。

0

看來你正在使用logits來計算驗證損失;使用預測,這可能會有所幫助。

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

使用tf.nn.sparse_softmax_cross_entropy_with_logits計算損失,該值使用未縮放的logits並在內部執行softmax。 – user3897060