ChatGPT解决这个技术问题 Extra ChatGPT

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

我正在使用 Keras 为我的项目训练神经网络。 Keras 提供了提前停止的功能。我可以知道应该观察哪些参数来避免我的神经网络通过使用提前停止来过度拟合吗?


u
umutto

https://i.stack.imgur.com/wkK5f.gif

早期停止基本上是在您的损失开始增加(或者换句话说验证准确性开始降低)时停止训练。根据documents,它的用法如下;

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

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

通过将 monitor 参数设置为“val_loss”来监控验证损失(需要使用交叉验证或至少训练/测试集)。 min_delta 是一个阈值,用于将某个时期的损失量化为改进与否。如果 loss 的差异低于 min_delta,则量化为没有改善。最好将其保留为 0,因为我们对损失何时变得更糟感兴趣。耐心参数表示一旦您的损失开始增加(停止改善),在停止之前的时期数。这取决于你的实现,如果你使用非常小的批次或大的学习率,你的损失之字形(准确度会更嘈杂)所以最好设置一个大的耐心参数。如果您使用大批量和小学习率,您的损失会更平滑,因此您可以使用较小的耐心参数。无论哪种方式,我都会将其保留为 2,因此我会给模型更多机会。详细决定要打印的内容,将其保留为默认值 (0)。 mode 参数取决于您监控的数量的方向(应该是减少还是增加),因为我们监控损失,我们可以使用 min.但是让我们让 keras 为我们处理它并将其设置为 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 在评论中指出的那样,模型的训练将继续,直到满足早期停止条件或满足 fit() 中的 epochs 参数(默认 = 10)。设置 Early Stopping 回调不会使模型训练超出其 epochs 参数。因此,使用较大的 epochs 值调用 fit() 函数将从 Early Stopping 回调中受益更多。


@AizuddinAzman 关闭,min_delta 是一个阈值,用于将监测值的变化量化为改进与否。所以是的,如果我们给出 monitor = 'val_loss',那么它将指当前验证损失和先前验证损失之间的差异。在实践中,如果你给 min_delta=0.1 一个小于 0.1 的验证损失(当前 - 以前)的减少将不会量化,因此会停止训练(如果你有 patience = 0)。
请注意,callbacks=[EarlyStopping(patience=2)] 无效,除非将 epochs 赋予 model.fit(..., epochs=max_epochs)
@BrentFaust这也是我的理解,我在假设模型正在接受至少10个时期的训练(默认情况下)的情况下编写了答案。在您发表评论后,我意识到程序员可能会在 for 循环中使用 epoch=1 调用 fit (对于各种用例),在这种情况下,此回调会失败。如果我的回答有歧义,我会尝试以更好的方式提出。
@AdmiralWen 自从我写了答案后,代码就发生了一些变化。如果您使用的是最新版本的 Keras,则可以使用 restore_best_weights 参数(文档中还没有),它会在训练后加载具有最佳权重的模型。但是,出于您的目的,我将使用带有 save_best_only 参数的 ModelCheckpoint 回调。您可以查看文档,它可以直接使用,但您需要在训练后手动加载最佳权重。
@umutto 您好,感谢 restore_best_weights 的建议,但是我无法使用它,`es = EarlyStopping(monitor='val_acc', min_delta=1e-4, patient=patience_,verbose=1,restore_best_weights=True) TypeError: __init__() 得到了一个意外的关键字参数“restore_best_weights”。有任何想法吗? keras 2.2.2, tf, 1.10 你的版本是什么?
c
cannin

下面是另一个项目 AutoKeras (https://autokeras.com/) 中的 EarlyStopping 示例,它是一个自动化机器学习 (AutoML) 库。该库设置了两个 EarlyStopping 参数:patience=10min_delta=1e-4

https://github.com/keras-team/autokeras/blob/5e233956f32fddcf7a6f72a164048767a0021b9a/autokeras/engine/tuner.py#L170

AutoKeras 和 Keras 监控的默认数量是 val_loss

https://github.com/keras-team/keras/blob/cb306b4cc446675271e5b15b4a7197efd3b60c34/keras/callbacks.py#L1748 https://autokeras.com/image_classifier/