有没有办法仅在第一个(例如 100 个时代)之后才在 Keras 中实现提前停止

kch*_*462 3 python neural-network keras

我的拟合函数是非凸函数,因此损失函数有时会在改善之前恶化。鉴于此,我想使用提前停止,但仅在前 100 个或更多 epoch 之后。到目前为止,我有这个:

# Early stopping
ES = [EarlyStopping(monitor='val_loss',patience=100,verbose=1,mode='auto')]

# fit model
history = model.fit(x_train, y_train, epochs=1000,batch_size=50,verbose=2,shuffle=True,validation_split=.1,callbacks=ES)
Run Code Online (Sandbox Code Playgroud)

不幸的是,拟合在 10 个左右的 epoch 后很早就停止了。我想等到第100个纪元开始提前停止。有任何想法吗?除了提前停止之外的任何建议也值得赞赏。

McL*_*nce 11

如果你使用patience=100你的训练不应该在 epoch 100 之前停止。但是,如果你想有一个短暂的patience但又希望它稍后开始,你可以使用 colllin 描述的方法。如果你想要进一步的定制,你总是可以定义你自己的回调,这里EarlyStopping作为父级。出于您的目的,您只需要覆盖初始化程序和此处on_epoch_end找到的方法:

class CustomStopper(keras.callbacks.EarlyStopping):
    def __init__(self, monitor='val_loss',
             min_delta=0, patience=0, verbose=0, mode='auto', start_epoch = 100): # add argument for starting epoch
        super(CustomStopper, self).__init__()
        self.start_epoch = start_epoch

    def on_epoch_end(self, epoch, logs=None):
        if epoch > self.start_epoch:
            super().on_epoch_end(epoch, logs)
Run Code Online (Sandbox Code Playgroud)

在从父类调用函数之前,您只需将要监视条件的最早时期提供给初始值设定项并检查条件。

  • 我不知道它在 python2 中是如何工作的,但我使用的是 python3,我需要使用 super(CustomStopper, self).__init__(monitor=monitor,patience=patience,min_delta=min_delta,mode=mode) 将我的参数传递给父类。否则它只使用默认参数 (2认同)