我的 LSTM 模型过拟合验证数据
Posted
技术标签:
【中文标题】我的 LSTM 模型过拟合验证数据【英文标题】:My LSTM model overfits over validation data 【发布时间】:2020-06-19 23:54:52 【问题描述】:这是我对手势进行分类的 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% 的准确率
【问题讨论】:
您好,过拟合是深度学习中很常见的问题。您能否重新提出问题并更具体地说明您为解决问题所采取的步骤? 我修改了 Dropout 值,减少了 pf LSTM 单元的数量,更改了优化器,但我遇到了同样的问题。我可以尝试数据增强,但我不知道它是否会很有趣 显示代码的“model.fit”部分! @Bharath batch_size = 128 num_epochs = 30 history = model.fit( trainx, trainy, batch_size=batch_size, epochs=num_epochs, validation_data= (testx, testy) ) 我猜这是样本的分布,通过适当的分层将它们分开,它可能会正常工作。 【参考方案1】:过拟合在深度学习中很常见。 要避免过度拟合您的 LSTM 架构,请按以下顺序尝试以下操作:
-
将学习率从 0.1 或 0.01 降低到 0.001,0.0001,0.00001。
减少历元数。您可以尝试将训练和验证准确度绘制为 epoch 数的函数,并查看训练准确度何时大于验证准确度。那是您应该使用的时期数。将此与降低学习率的第一步相结合。
那你可以尝试修改LSTM的架构,这里已经加了dropout(最大值0.5),我建议试试0.2、0.3。您有 3 个比 2 个更好的单元格,节点的大小看起来很合理。您当前使用的嵌入维度是什么?由于您过度拟合,因此值得尝试将单元格数量从 3 个减少到 2 个并保持相同数量的节点。
批量大小以及数据集中子类的分布可能很重要。数据集在训练集和验证集之间是否均匀分布和均衡?我的意思是,如果与验证集相比,训练集中的一个手势被过度表示,这可能是一个问题。克服这个问题的一个好策略是将部分数据保留为测试集。然后使用 sklearn 进行训练/拆分交叉验证(5 次)。然后分别在每个训练/拆分模型上训练您的架构(5 次)并比较训练和验证的准确性。如果拆分或集合之间存在很大偏差,您将能够以这种方式识别它。
最后,您可以尝试增强,特别是旋转和水平/垂直翻转。这个库可能会帮助https://github.com/aleju/imgaug
希望这会有所帮助!
【讨论】:
【参考方案2】:您如何知道网络过度拟合与数据集中存在某种错误。验证损失最初是否会提高到某个时期,然后达到平稳状态或开始增加?然后就过拟合了。如果它从 50% 开始并保持在那里,这不是一个过度拟合的问题。随着退出量的增加,您过度拟合的可能性看起来不大。你是如何选择验证集的?它是从整个数据集中随机选择的还是您进行了选择?随机选择数据总是更好,以便其概率分布反映训练数据的概率分布。如 cmets 所述,请显示您的 model.fit 代码,那里可能存在问题。你如何输入数据?你用过发电机吗? 50% 的验证准确度让我怀疑在向网络提供验证数据的方式中存在一些错误,或者在验证数据的标记中存在一些错误。我还建议您考虑使用基于对验证损失的监控来动态调整学习率。 Keras 对此有回调 称为 ReduceLROnPlateau。文档是here。设置它以监控验证丢失。我设置了参数耐心=3 和因子=.5,这似乎效果很好。您可以将训练想象成下降到山谷中。当你下降时,山谷变得越来越窄。如果学习率太大并且保持固定,您将无法进一步降低到最小值。这应该会提高您的训练准确性,从而提高验证准确性。正如我所说的辍学水平,我认为它并不过分拟合,但如果是,你也可以使用 Keras 正则化来帮助避免过度训练。文档是here。
【讨论】:
以上是关于我的 LSTM 模型过拟合验证数据的主要内容,如果未能解决你的问题,请参考以下文章