簡體   English   中英

驗證損失低於培訓損失培訓LSTM

[英]Validation loss is lower than training loss training LSTM

我正在使用Tensorflow中的tf.learn訓練LSTM。 為此,我將數據分為訓練(90%)和驗證(10%)。 據我了解,模型通常比驗證數據更適合訓練數據,但結果卻相反。 驗證集的損失更低,准確性更高。

正如我在其他答案中讀到的那樣,這可能是由於在驗證期間未應用輟學。 但是,當我從LSTM架構中刪除輟學時,驗證損失仍然低於訓練損失(盡管差異較小)。

同樣,每個時期末顯示的損失也不是每個批次中損失的平均值(例如使用Keras時)。 這是他最后一批的損失。 我還認為這可能是我取得成績的原因,但事實並非如此。

Training samples: 783
Validation samples: 87
--
Training Step: 4  | total loss: 1.08214 | time: 1.327s
| Adam | epoch: 001 | loss: 1.08214 - acc: 0.7549 | val_loss: 0.53043 - val_acc: 0.9885 -- iter: 783/783
--
Training Step: 8  | total loss: 0.41462 | time: 1.117s
| Adam | epoch: 002 | loss: 0.41462 - acc: 0.9759 | val_loss: 0.17027 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 12  | total loss: 0.15111 | time: 1.124s
| Adam | epoch: 003 | loss: 0.15111 - acc: 0.9984 | val_loss: 0.07488 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 16  | total loss: 0.10145 | time: 1.114s
| Adam | epoch: 004 | loss: 0.10145 - acc: 0.9950 | val_loss: 0.04173 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 20  | total loss: 0.26568 | time: 1.124s
| Adam | epoch: 005 | loss: 0.26568 - acc: 0.9615 | val_loss: 0.03077 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 24  | total loss: 0.11023 | time: 1.129s
| Adam | epoch: 006 | loss: 0.11023 - acc: 0.9863 | val_loss: 0.02607 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 28  | total loss: 0.07059 | time: 1.141s
| Adam | epoch: 007 | loss: 0.07059 - acc: 0.9934 | val_loss: 0.01882 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 32  | total loss: 0.03571 | time: 1.122s
| Adam | epoch: 008 | loss: 0.03571 - acc: 0.9977 | val_loss: 0.01524 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 36  | total loss: 0.05084 | time: 1.120s
| Adam | epoch: 009 | loss: 0.05084 - acc: 0.9948 | val_loss: 0.01384 - val_acc: 1.0000 -- iter: 783/783
--
Training Step: 40  | total loss: 0.22283 | time: 1.132s
| Adam | epoch: 010 | loss: 0.22283 - acc: 0.9714 | val_loss: 0.01227 - val_acc: 1.0000 -- iter: 783/783

使用的網絡(請注意,輟學已被注釋掉):

def get_network_wide(frames, input_size, num_classes):
    """Create a one-layer LSTM"""
    net = tflearn.input_data(shape=[None, frames, input_size])
    #net = tflearn.lstm(net, 256, dropout=0.2)
    net = tflearn.fully_connected(net, num_classes, activation='softmax')
    net = tflearn.regression(net, optimizer='adam',
                             loss='categorical_crossentropy',metric='default', name='output1')
    return net 

驗證損失與訓練損失的關系圖

本質上, 這不一定是有問題的現象

我已經訓練CNN和LSTM已有一段時間了,並且根據訓練/驗證集的結構/結構,與訓練集相比,您可以在驗證集上獲得更好的驗證准確性/更少的驗證損失。

發生這種情況的原因有很多:

  1. 通常當您的訓練數據難以訓練/學習模式時可能會發生,而驗證集擁有“容易”的圖像/數據進行分類。 LSTM /序列分類數據也可以使用。

  2. 在訓練的早期階段,可能會發生驗證損失小於訓練損失/驗證准確度大於訓練准確度的情況。

  3. 驗證期間,未啟用退出功能,從而導致驗證集上的結果更好。

但是,您的訓練集以及驗證集都很小。 僅在有非常多的數據(在這種情況下為數萬甚至數十萬)時才進行這種拆分(在訓練中為90%,在驗證/開發中為10%)。 另一方面,您的整個訓練集(train + val)少於1000個樣本。 您需要更多的數據,因為眾所周知LSTM需要大量的訓練數據。

然后,您可以嘗試使用KFoldCrossValidationStratifiedKFoldCrossValidation。 這樣,您可以確保沒有手動創建一個非常“簡單”的驗證集,您可以始終對其進行測試; 相反,您可以有k折,其中k-1用於訓練,1用於驗證; 這樣,您可以避免情況(1)。

答案在於數據 仔細准備它 ,因為結果在很大程度上取決於數據的質量(預處理數據,清潔數據,創建相關的培訓/驗證/測試集)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM