Answers:
一旦损失开始增加(或换句话说,验证准确性开始降低),早期停止基本上就是停止训练。根据文件,其用法如下;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
值取决于您的实现(问题,批处理大小等),但通常是为了防止我使用过度拟合;
monitor
参数设置为,监控验证损失(需要使用交叉验证或至少训练/测试集)'val_loss'
。min_delta
是在某个时期是否将损失量化为改善的阈值。如果损失差异小于min_delta
,则将其量化为无改善。最好将其保留为0,因为我们对损失越来越严重感兴趣。patience
参数代表损失开始增加(停止改善)后停止之前的时期数。这取决于您的实现,如果您使用的批次非常小
或学习率较高,则损失呈锯齿状(准确性会更加嘈杂),因此最好设置一个较大的patience
参数。如果您使用大批量且学习率较低,则损失会更平稳,因此可以使用较小的patience
参数。无论哪种方式,我都将其保留为2,以便为模型提供更多机会。verbose
确定要打印的内容,将其保留为默认值(0)。mode
参数取决于您监视的数量的方向(应该是减少还是增加),因为我们监视损失,所以可以使用min
。但是让我们留给喀拉拉邦为我们处理,并将其设置为auto
因此,我将使用类似的方法并通过绘制有无早期停止的错误损失来进行实验。
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
为了避免对回调的工作方式产生歧义,我将尝试解释更多信息。调用fit(... callbacks=[es])
模型后,Keras会调用给定的回调对象预定的函数。这些功能可以称为on_train_begin
,on_train_end
,on_epoch_begin
,on_epoch_end
和on_batch_begin
,on_batch_end
。在每个时期结束时调用提前停止回调,将最佳监视值与当前监视值进行比较,并在条件满足时停止(自观察最佳监视值以来已经过去了多少个时期,这不仅仅是耐心参数,两者之间的差最后一个值大于min_delta等。)。
正如@BrentFaust在评论中指出的那样,模型的训练将继续进行,直到满足Early Stopping条件或满足epochs
in(默认值= 10)为止fit()
。设置“提早停止”回调不会使模型超出其epochs
参数进行训练。因此,调用fit()
较大epochs
值的函数将受益于Early Stopping回调。
callbacks=[EarlyStopping(patience=2)]
,除非赋予epochs,否则它无效model.fit(..., epochs=max_epochs)
。
epoch=1
在for循环中(对于各种用例)调用fit with ,此回调将失败。如果我的答案中有歧义,我将尝试以更好的方式解决。
restore_best_weights
参数(尚未在文档中使用),该参数在训练后以最佳权重加载模型。但是,出于您的目的,我将使用ModelCheckpoint
带save_best_only
参数的回调。您可以查阅文档,使用起来很简单,但是需要在培训后手动加载最佳重量。
min_delta
是确定是否将监视值的变化量化为改进的阈值。因此,是的,如果我们给出的monitor = 'val_loss'
话,它将指当前验证损失与先前验证损失之间的差额。在实践中,如果您提供min_delta=0.1
的验证损失(当前-先前)减少幅度小于0.1,则无法量化,因此将停止训练(如果您有patience = 0
)。