簡體   English   中英

我的 LSTM 模型過度擬合驗證數據

[英]My LSTM model overfits over validation data

這是我的 LSTM 模型來對手勢進行分類。 最初,我有 1960 個形狀 (num_sequences, num_joints, 3) 的訓練數據,我將其重塑為形狀 (num_sequences, num_joints*3)。

這是我的模型:

input_shape = (trainx.shape[1], trainx.shape[2])
print("Build LSTM RNN model ...")
model = Sequential()
model.add(Masking(mask_value=0., input_shape=(171, 66)))

model.add(Bidirectional(LSTM(units=256,  activation='tanh', return_sequences=True, input_shape=input_shape)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Bidirectional(LSTM(units=128,  activation='tanh',    return_sequences=True)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Bidirectional(LSTM(units=128,  activation='tanh',    return_sequences=False)))
model.add(Dropout(0.5))
model.add(BatchNormalization())

model.add(Dense(units=trainy.shape[1], activation="softmax"))

print("Compiling ...")
# Keras optimizer defaults:
# Adam   : lr=0.001, beta_1=0.9,  beta_2=0.999, epsilon=1e-8, decay=0.
# RMSprop: lr=0.001, rho=0.9,                   epsilon=1e-8, decay=0.
# SGD    : lr=0.01,  momentum=0.,                             decay=0.
opt = Adam()
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])

我在火車上獲得了 90% 的准確率,在測試中獲得了 50% 的准確率

過擬合在深度學習中很常見。 為了避免過度擬合你的 LSTM 架構,請按以下順序嘗試以下操作:

  1. 將學習率從 0.1 或 0.01 降低到 0.001,0.0001,0.00001。
  2. 減少 epoch 的數量。 您可以嘗試將訓練和驗證准確度繪制為 epoch 數的函數,並查看訓練准確度何時變得大於驗證准確度。 這是您應該使用的時代數。 將此與降低學習率的第一步相結合。
  3. 然后你可以嘗試修改LSTM的架構,這里你已經添加了dropout(最大值0.5),我建議嘗試0.2、0.3。 您有 3 個比 2 個更好的單元格,節點的大小看起來合理。 您當前使用的嵌入維度是多少? 由於您過度擬合,因此值得嘗試將單元格數量從 3 減少到 2 並保持相同數量的節點。
  4. 批量大小以及數據集中子類的分布可能很重要。 數據集在訓練集和驗證集之間是否均勻​​分布和均衡? 我的意思是,如果一個手勢在訓練集中與驗證集相比可能是一個問題。 克服這個問題的一個好策略是保留部分數據作為測試集。 然后使用 sklearn(5 次)進行訓練/拆分交叉驗證。 然后分別在每個訓練/拆分模型上訓練您的架構(5 次)並比較訓練和驗證的准確性。 如果拆分或集合之間存在很大偏差,您將能夠以這種方式識別它。
  5. 最后,您可以嘗試增強,特別是旋轉和水平/垂直翻轉。 這個庫可能會幫助https://github.com/aleju/imgaug

希望這可以幫助!

您如何知道網絡過度擬合與數據集中的某種錯誤。 驗證損失最初會改善到某個時期,然后達到平穩狀態還是開始增加? 然后就過擬合了。 如果它從 50% 開始並保持在那里,則不是過度擬合問題。 隨着輟學的數量,你看起來不太可能過度擬合。 你是如何選擇驗證集的? 它是從整個數據集中隨機選擇的還是您進行了選擇? 隨機選擇數據總是更好,以便其概率分布反映訓練數據的概率分布。 正如評論中所說,請顯示您的 model.fit 代碼,那里可能有問題。 你如何輸入數據? 你用過發電機嗎? 50% 的驗證准確率讓我懷疑您的驗證數據是如何提供給網絡的,或者驗證數據的標簽存在一些錯誤。 我還建議您考慮根據驗證損失的監控動態調整學習率。 Keras 有一個回調函數,稱為 ReduceLROnPlateau。 文檔在這里 設置它以監控驗證丟失。 我設置了參數 Patient=3 和 factor=.5 這似乎工作得很好。 你可以把訓練想象成下降到一個山谷。 當你下降時,山谷變得更窄。 如果學習率太大並且保持固定,您將無法進一步接近最小值。 這應該會提高您的訓練准確性,從而提高驗證准確性。 正如我所說的輟學水平,我不認為它過度擬合,但如果是,您也可以使用 Keras 正則化來幫助避免過度訓練。 文檔在這里

暫無
暫無

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

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