哪些参数应用于提前停止?


Answers:


156

提前停止

一旦损失开始增加(或换句话说,验证准确性开始降低),早期停止基本上就是停止训练。根据文件,其用法如下;

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=0,
                              verbose=0, mode='auto')

值取决于您的实现(问题,批处理大小等),但通常是为了防止我使用过度拟合;

  1. 通过将monitor 参数设置为,监控验证损失(需要使用交叉验证或至少训练/测试集)'val_loss'
  2. min_delta是在某个时期是否将损失量化为改善的阈值。如果损失差异小于min_delta,则将其量化为无改善。最好将其保留为0,因为我们对损失越来越严重感兴趣。
  3. patience参数代表损失开始增加(停止改善)后停止之前的时期数。这取决于您的实现,如果您使用的批次非常小学习率较高,则损失呈锯齿状(准确性会更加嘈杂),因此最好设置一个较大的patience参数。如果您使用大批量学习率较低,则损失会更平稳,因此可以使用较小的patience参数。无论哪种方式,我都将其保留为2,以便为模型提供更多机会。
  4. verbose 确定要打印的内容,将其保留为默认值(0)。
  5. mode参数取决于您监视的数量的方向(应该是减少还是增加),因为我们监视损失,所以可以使用min。但是让我们留给喀拉拉邦为我们处理,并将其设置为auto

因此,我将使用类似的方法并通过绘制有无早期停止的错误损失来进行实验。

keras.callbacks.EarlyStopping(monitor='val_loss',
                              min_delta=0,
                              patience=2,
                              verbose=0, mode='auto')

为了避免对回调的工作方式产生歧义,我将尝试解释更多信息。调用fit(... callbacks=[es])模型后,Keras会调用给定的回调对象预定的函数。这些功能可以称为on_train_beginon_train_endon_epoch_beginon_epoch_endon_batch_beginon_batch_end。在每个时期结束时调用提前停止回调,将最佳监视值与当前监视值进行比较,并在条件满足时停止(自观察最佳监视值以来已经过去了多少个时期,这不仅仅是耐心参数,两者之间的差最后一个值大于min_delta等。)。

正如@BrentFaust在评论中指出的那样,模型的训练将继续进行,直到满足Early Stopping条件或满足epochsin(默认值= 10)为止fit()。设置“提早停止”回调不会使模型超出其epochs参数进行训练。因此,调用fit()较大epochs值的函数将受益于Early Stopping回调。


3
@AizuddinAzman close min_delta是确定是否将监视值的变化量化为改进的阈值。因此,是的,如果我们给出的monitor = 'val_loss'话,它将指当前验证损失与先前验证损失之间的差额。在实践中,如果您提供min_delta=0.1的验证损失(当前-先前)减少幅度小于0.1,则无法量化,因此将停止训练(如果您有patience = 0)。
umutto

3
请注意callbacks=[EarlyStopping(patience=2)],除非赋予epochs,否则它无效model.fit(..., epochs=max_epochs)
布伦特·浮士德

1
@BrentFaust这也是我的理解,我在假设模型至少要经过10个时期(默认)的前提下编写答案。在您发表评论之后,我意识到,在某些情况下,程序员可能会epoch=1在for循环中(对于各种用例)调用fit with ,此回调将失败。如果我的答案中有歧义,我将尝试以更好的方式解决。
umutto

4
@AdmiralWen自从我写下答案以来,代码已经有所更改。如果使用的是Keras的最新版本,则可以使用restore_best_weights参数(尚未在文档中使用),该参数在训练后以最佳权重加载模型。但是,出于您的目的,我将使用ModelCheckpointsave_best_only参数的回调。您可以查阅文档,使用起来很简单,但是需要在培训后手动加载最佳重量。
umutto

1
@umutto您好,感谢restore_best_weights的建议,但是我无法使用它,es = EarlyStopping(monitor ='val_acc',min_delta = 1e-4,patience = patience_,verbose = 1,restore_best_weights = True)TypeError: __init __()获得了意外的关键字参数'restore_best_weights'`。有任何想法吗?keras 2.2.2,tf,1.10是什么版本?
Haramoz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.