模型的早期停止和最终损失或权重

数据挖掘 机器学习 深度学习 喀拉斯 过拟合 时代
2022-02-20 11:51:28

在一个深度模型中,我在 Keras 中使用了如下的早期停止技术:

from keras.callbacks import EarlyStopping

early_stopping = [EarlyStopping(monitor='val_loss',
                          min_delta=0,
                          patience=2,
                          verbose=2, mode='auto')]

model.fit(train_x, train_y, batch_size=batch_size,
                epochs=epochs, verbose=1,
                callbacks=early_stopping,
                validation_data=(val_x, val_y))

model.fit(train_x, train_y, batch_size=batch_size, 
                epochs=epochs, verbose=2, 
                callbacks=early_stopping,
                validation_data=(val_x, val_y))

现在,当我运行此代码时,它会在输出中打印每个时期的训练和验证的损失值。

我设置patience=2在早期停止。因此,当验证损失增加而不是减少时,它会继续训练过程两次。

像这样的一些事情:

Epoch 1/10
- 198s - loss: 99.7160 - val_loss: 123.0397 
Epoch 2/10
- 204s - loss: 78.7000 - val_loss: 109.0344 
Epoch 3/10
- 208s - loss: 65.4412 - val_loss: 78.0097 
Epoch 4/10
- 268s - loss: 61.9812 - val_loss: 79.0312
Epoch 5/10
- 298s - loss: 59.1124 - val_loss: 79.3397 
Epoch 6/10
- 308s - loss: 57.2200 - val_loss: 218.0397 
Epoch 00007: early stopping

最后,模型的最终权重和损失值是多少?最后一次训练还是之前的两次呢?

如果考虑到最后一个epoch,那么我是否应该尽可能少地设置耐心以克服过度拟合?

谢谢

1个回答

早停

最终权重将被保存,而不是patience触发参数的权重。

查看EarlyStopping 的文档,它似乎在任何时候都没有涉及保存权重 - 没有提到。

编辑

经过进一步调查(阅读源代码),您似乎确实可以保存最好的,使用 EarlyStopper 回调

可以使用参数初始化该类restore_best_weights如此处所示然后在训练结束时,当您的等待时间超过耐心参数时,模型的权重将返回为最佳权重(最低验证损失时模型的权重:

if self.restore_best_weights:
    if self.verbose > 0:
        print("Restoring model weights from the end of the best epoch")
    self.model.set_weights(self.best_weights)

它通过跟踪所选指标并将其与记录的最佳值进行比较来做到这一点。默认情况下,这将是验证损失。查看课程代码和那里的课程描述

如果这些参数不适用于您的代码,您将需要升级到最新版本(来自 GitHub 的 master 分支)。这个新参数是10 天前才添加的

模型检查点

如果您想使用回调来防止过拟合,请查看ModelCheckpoint 回调类这具有在训练期间的给定时间保存模型权重的选项,并允许您在 epoch 结束时保持模型的权重,特别是在验证损失最小的地方。这是使用save_best_only参数选择的 - 像这样使用它:

from keras.callbacks import EarlyStopper, ModelCheckpoint

checkpointer = ModelCheckpoint(filepath, monitor='val_loss', verbose=0,
                               save_best_only=False, save_weights_only=False,
                               mode='auto', period=1)

# your early stopper as before
early_stopper = ...

所有回调必须放在一个列表中:

my_callbacks = [checkpointer, early_stopper]

# pass to model along with other parameters as you did already
model.fit(..., callbacks=my_callbacks, ...)

如果您不使用save_best_only,则默认行为是在每个 epoch 结束时保存模型。

您可以filepath使用训练期间可用的某些动态变量来设置,以便文件名具有一些有用的信息:

例如 filepath is weights.{epoch:02d}-{val_loss:.2f}.hdf5

模型检查点将与文件名中的纪元号和验证损失一起保存。

查看链接文档以了解如何使用ModelCheckpoint.