训练损失有所改善,但验证收敛较早

Training Loss Improving but Validation Converges Early

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

有谁知道为什么会这样,我怎么可能解决它,让验证损失随着培训而减少?将不胜感激!

我的模型学习曲线图:

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

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

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

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 中包含 callbacks=callbacks。我怀疑以上都不会提供很大的改进。您可能还必须尝试对您的模型进行一些更改。添加一个 Dropout 层可能在某种程度上有助于减少过度拟合,就像包括正则化一样。相关文档是 here.. Of course the standard approach of getting a larger data set may also help but is not always easy to achieve. If you are working with images you could try image augmentation using say the Keras ImageDataGenerator or Tensorflow Image Augmentation layers. Documentation for that is here.。我发现对图像有帮助的一件事是将图像裁剪到感兴趣区域 (ROI)。例如,如果您正在进行人脸识别,将图像裁剪成只有人脸的图像会有很大帮助。