【问题标题】:Validation Loss and Accuracy in LSTM Networks with Keras使用 Keras 的 LSTM 网络中的验证损失和准确性
【发布时间】:2016-09-13 17:03:30
【问题描述】:

我为在 Keras 中使用 imdb 数据集的 LSTM 网络运行示例代码。可以在以下链接中找到代码。 imdb_lstm.py

我的问题是,随着代码的进行,训练损失会减少,训练准确度会按预期增加,但验证准确度会在一段时间内波动,验证损失会增加到很高的值。我在下面附上训练阶段的部分日志。甚至我观察到,当训练损失非常小(~ 0.01-0.03)时,有时它会在下一个时期增加,然后再次减少。我提到的可以在 75-77 时代看到。但总的来说它会减少。

我的期望是训练准确率总是提高到 0.99-1,训练损失总是减少。此外,验证准确度应该从大约 0.4 开始并最终提高到例如 0.8。如果验证准确性在多个时期内没有提高,那么在时期内等待的意义何在?最后,测试精度也接近 0.81。

我也尝试使用我自己的数据并想出了同样的情况。我以类似的方式处理我的数据。我的意思是我的训练、验证和测试点的处理逻辑与本示例代码中的逻辑相同。

此外,在从 LSTM 获得每个单词的输出后,我不明白这段代码如何表示整个句子。它是进行平均池化还是最大池化,还是只取 LSTM 层的最后一个输出,然后再将其提供给逻辑回归分类器?

任何帮助将不胜感激。

Using Theano backend.
Loading data...
25000 train sequences
25000 test sequences
Pad sequences (samples x time)
X_train shape: (25000, 80)
X_test shape: (25000, 80)
Build model...
Train...
Train on 22500 samples, validate on 2500 samples
Epoch 1/100
22500/22500 [==============================] - 236s - loss: 0.5438 - acc: 0.7209 - val_loss: 0.4305 - val_acc: 0.8076
Epoch 2/100
22500/22500 [==============================] - 237s - loss: 0.3843 - acc: 0.8346 - val_loss: 0.3791 - val_acc: 0.8332
Epoch 3/100
22500/22500 [==============================] - 245s - loss: 0.3099 - acc: 0.8716 - val_loss: 0.3736 - val_acc: 0.8440
Epoch 4/100
22500/22500 [==============================] - 243s - loss: 0.2458 - acc: 0.9023 - val_loss: 0.4206 - val_acc: 0.8372
Epoch 5/100
22500/22500 [==============================] - 239s - loss: 0.2120 - acc: 0.9138 - val_loss: 0.3844 - val_acc: 0.8384
....
....
Epoch 75/100
22500/22500 [==============================] - 238s - loss: 0.0134 - acc: 0.9868 - val_loss: 0.9045 - val_acc: 0.8132
Epoch 76/100
22500/22500 [==============================] - 241s - loss: 0.0156 - acc: 0.9845 - val_loss: 0.9078 - val_acc: 0.8211
Epoch 77/100
22500/22500 [==============================] - 235s - loss: 0.0129 - acc: 0.9883 - val_loss: 0.9105 - val_acc: 0.8234

【问题讨论】:

    标签: neural-network deep-learning keras lstm recurrent-neural-network


    【解决方案1】:
    1. 何时停止训练:当基于验证数据计算的某个指标开始增长时,通常会停止训练。这是过度拟合的常见指标。但请注意,您使用的是 dropout 技术——这会导致在每个 epoch 训练的模型略有不同——这就是为什么你应该耐心等待——并在连续几个 epoch 发生此类现象时停止训练。

    2. 波动的原因: 与第一点相同 - 您使用的是 dropout 技术,该技术会为您的网络引入某种随机性。在我看来,这是观察到波动的主要原因。

    3. Keras 模型将什么作为 Dense 层的输入:如果您仔细研究 LSTM/RNN 层的文档,您会注意到 return_sequences=False 设置为默认参数。这意味着只有经过处理的序列的最后一个输出被用作下一层的输入。您可以使用 1-D Convolutions 更改它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-25
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 2020-08-08
      • 2019-08-21
      • 2022-10-05
      • 2018-04-23
      相关资源
      最近更新 更多