python - 我的 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% 的准确率
解决方案
过拟合在深度学习中很常见。为了避免过度拟合您的 LSTM 架构,请按以下顺序尝试以下操作:
- 将学习率从 0.1 或 0.01 降低到 0.001,0.0001,0.00001。
- 减少 epoch 的数量。您可以尝试将训练和验证准确度绘制为 epoch 数的函数,并查看训练准确度何时大于验证准确度。那是您应该使用的时期数。将此与降低学习率的第一步相结合。
- 然后你可以尝试修改LSTM的架构,这里你已经添加了dropout(最大值0.5),我建议尝试0.2、0.3。您有 3 个比 2 个更好的单元格,节点的大小看起来很合理。您当前使用的嵌入维度是什么?由于您过度拟合,因此值得尝试将单元数从 3 个减少到 2 个并保持相同数量的节点。
- 批量大小以及数据集中子类的分布可能很重要。数据集在训练集和验证集之间是否均匀分布和均衡?我的意思是,如果与验证集相比,训练集中的一个手势被过度表示,这可能是一个问题。克服这个问题的一个好策略是将部分数据保留为测试集。然后使用 sklearn 进行训练/拆分交叉验证(5 次)。然后在每个训练/拆分模型上分别训练您的架构(5 次)并比较训练和验证的准确性。如果拆分或集合之间存在很大偏差,您将能够以这种方式识别它。
- 最后,您可以尝试增强,特别是旋转和水平/垂直翻转。这个库可能会帮助https://github.com/aleju/imgaug
希望这可以帮助!
推荐阅读
- html - 我无法以角度运行 ngxPrint
- python - Plotly 中子图的相同 x 轴范围
- openstack-horizon - 在控制器节点上配置仪表板时 httpd 服务停止工作
- javascript - 这是一个纯函数吗?
- while-loop - 为什么这要求用户输入两次?
- docker - 在将文件从目标复制到 webapps 时在 Dockerfile 中出现错误
- c++ - 使用 typedef 指针指向类中的函数
- typescript - 将管道应用于控制器中的所有变量出现
- c# - 如何在 C# 中发送电子邮件时修复“发送电子邮件异常失败”?
- micrometer - 千分尺 | 为什么 CompositeMeterRegistry 管理 Set of Registry 而不是 List/LinkedHashSet?