首页 > 解决方案 > 我的 LSTM 模型过拟合验证数据

问题描述

这是我用来分类手势的 LSTM 模型。最初,我有 1960 个 shape(num_sequences, num_joints, 3) 的训练数据,我将其重塑为 shape(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% 的准确率

标签: pythonkerasdeep-learningclassificationlstm

解决方案


过拟合在深度学习中很常见。为了避免过度拟合您的 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

希望这可以帮助!


推荐阅读