【问题标题】:Training Loss Improving but Validation Converges Early训练损失改善但验证早期收敛
【发布时间】:2021-04-09 11:14:08
【问题描述】:

我正在使用 TensorFlow 创建一个 CNN,在训练时,我发现训练数据集仍在改进(即损失仍在减少),而测试/验证数据集已经收敛并且不再改进。 (学习曲线图附在下面)

有谁知道为什么会出现这种情况,我该如何解决它,以便随着训练减少验证损失?将不胜感激!

我的模型学习曲线图:

【问题讨论】:

  • 显示你的代码...
  • 您的 MSE 对于训练和验证都已经很低了。这是过拟合但非常轻微,因为训练的 MSE 是 ~0.001,验证集的 MSE 是 ~0.0015。你可以实施正则化来克服这个问题,但我发现模型很好。 0 的 MSE 被认为是一个完美的模型。

标签: python tensorflow deep-learning neural-network convergence


【解决方案1】:

这意味着您正在达到架构的极限,训练损失将不断减少(这被称为过度拟合),这最终会增加验证损失,更改参数或考虑更改您的层(添加、删除等)。 ),甚至可以研究改变数据集的方法。

当我前一段时间发生这种情况时,我在我的 CNN 架构中添加了一个 LSTM 层,并且还结合了 K-means 验证,这不是一个演练,您需要针对您的具体问题解决这个问题,祝您好运。

【讨论】:

  • 如果我让神经网络进一步过拟合,它会对我的模型的预测产生负面影响吗?如在,我是否也应该将时期数减少到验证集收敛的点?感谢您的帮助!
  • 是的,这样做的一种方法是仅当验证损失在整个时期内减少时才保存模型中的更改,但是,有很多方法可以更好地做到这一点
【解决方案2】:

损失图非常典型。您的模型在 MSE 损失非常低的情况下表现得非常好。此时,您基本上已经达到了模型性能的极限。可能有帮助的一件事是使用可调节的学习率。可以设置 Keras 回调 ReduceLROnPlateau 来监控验证损失。如果验证损失未能减少“耐心”的时期数,则学习率将减少一个因子“因子”,其中因子是小于 1 的数字。文档是 here. 您可能还想使用 Keras EarlyStopping 回调。可以设置此回调以监控验证损失并在它未能减少“耐心”时期数时停止训练。如果您设置 restore_best_weights=True 它将使您的模型具有在 epoch 中使用的权重,并具有最低的验证损失。这将防止您的模型返回过拟合模型。我推荐的代码如下所示

rlronp=f.keras.callbacks.ReduceLROnPlateau(monitor="val_loss", factor=0.5, patience=1)
    

estop=tf.keras.callbacks.EarlyStopping(monitor="val_loss",patience=3,restore_best_weights=True)
callbacks=[rlronp, estop]

在 model.fit 中包含回调=回调。我怀疑以上都不会提供太大的改进。您可能还必须尝试对模型进行一些更改。添加 Dropout 层可能在一定程度上有助于减少过度拟合,包括正则化。相关文档是here.。当然,获取更大数据集的标准方法也可能有所帮助,但并不总是很容易实现。如果您正在处理图像,您可以尝试使用 Keras ImageDataGenerator 或 Tensorflow 图像增强层进行图像增强。相关文档是here.。我发现对图像有帮助的一件事是将图像裁剪为感兴趣区域 (ROI)。例如,如果您在进行人脸识别,将图像裁剪为仅是人脸将有很大帮助。

【讨论】:

  • 我正在做类似的事情,通过手动重新编译和拟合模型,使用较低的 LR。但是现在想一想,会不会导致模型过拟合(不管我是用ReduceLROnPlateau还是用手动改变LR)?非常感谢您的帮助!
  • 最终模型会过拟合。这就是为什么我包括了提前停止回调。通过降低学习率回调,您可以从较大的学习率开始,并让模型比使用非常小的学习率更快地收敛。
猜你喜欢
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
  • 2019-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-29
相关资源
最近更新 更多