Validation 只有在验证改进的情况下,我才能更新keras神经网络的权重吗?

Validation 只有在验证改进的情况下,我才能更新keras神经网络的权重吗?,validation,tensorflow,keras,neural-network,backpropagation,Validation,Tensorflow,Keras,Neural Network,Backpropagation,我正在keras中训练一个神经网络,我达到了一个经典极限——我的训练精度随着历次的增加而提高,但在9次历次之后,我的验证精度降低(见图) 我想知道我是否可以通过以下操作避免验证精度的降低:如果历元导致验证精度的提高,则使keras网络仅接受每个历元后对权重的更改,否则重置为历元前的状态?我假设验证在很大程度上开始发散,因为在每个历元>9之后,神经网络的权重偏离了与验证数据的相似性 那么,我的建议是一个好的实践吗?我可以在keras中实现它吗(是否有回调或选项,允许我仅在验证改进的情况下更新网络

我正在keras中训练一个神经网络,我达到了一个经典极限——我的训练精度随着历次的增加而提高,但在9次历次之后,我的验证精度降低(见图)

我想知道我是否可以通过以下操作避免验证精度的降低:如果历元导致验证精度的提高,则使keras网络仅接受每个历元后对权重的更改,否则重置为历元前的状态?我假设验证在很大程度上开始发散,因为在每个历元>9之后,神经网络的权重偏离了与验证数据的相似性

那么,我的建议是一个好的实践吗?我可以在keras中实现它吗(是否有回调或选项,允许我仅在验证改进的情况下更新网络)


附带问题:我的建议是否违反了“不要将验证数据用于培训”的原则?因为我隐式地将神经网络的性能作为验证数据的一个函数。

验证集的目的是让您了解通过使用训练数据学习模型所实现的可推广性。您不必拥有验证数据集。如果您的验证数据是培训数据的随机样本,那么您的最佳选择可能是修改您的体系结构


简而言之,如果希望模型基于验证数据进行训练,则在训练集中训练模型,然后获取结果模型,并在验证数据上训练它(即,将验证数据作为训练数据)。这显然违背了设置验证集的意义。

你听说过EarlyStopping回调吗?@MatiasValdenegro谢谢,是的,但EarlyStopping不是我想要的。提前停止训练可以让我在达到最佳状态后停止训练。相反,我想继续训练,但“强迫”我的神经网络采取一种训练路径,以提高验证精度。这与你想要的无关,提前停止训练是因为这是一种众所周知的做法,停止训练,因为如果你继续训练,通常验证损失会不断增加,没有这样的路径可以改善验证丢失。请记住,您是在训练集中训练的,因此如果您拒绝重量更新,那么您仍然在同一数据集上训练,您将陷入一个永无止境的循环。@MatiasValdenegro我理解您的意思。但我真的会“陷入一个永无止境的循环”吗?因为时不时地,即使在过度拟合的年代,也会有验证损失低于上一次更新损失的年代。如果我能只为这些时代更新神经网络,我也许能够推动神经网络泛化的改进。如果您知道如何在keras中编写这个条件,我很乐意测试它,并在这里为其他用户发布我的结果。