在Keras中,EarlyStopping回调表现得很神秘

时间:2017-10-10 00:32:50

标签: python tensorflow callback keras

我的模型在第4个时代之后停止训练,尽管我希望它能继续训练。我将监视器设置为验证丢失和耐心为2,我认为这意味着在验证丢失连续增加2个时期后训练停止。但是,在此之前,培训似乎已停止。

我已将EarlyStopping定义如下:

callbacks = [
        EarlyStopping(monitor='val_loss', patience=2, verbose=0),
    ]

在fit函数中,我使用它:

hist = model.fit_generator(
            generator(imgIds, batch_size=batch_size, is_train=True),
            validation_data=generator(imgIds, batch_size=batch_size, is_val=True),
            validation_steps=steps_per_val,
            steps_per_epoch=steps_per_epoch,
            epochs=epoch_count,
            verbose=verbose_level,
            callbacks=callbacks)

我不明白为什么训练在第4纪元后结束。

675/675 [==============================] - 1149s - loss: 0.1513 - val_loss: 0.0860
Epoch 2/30
675/675 [==============================] - 1138s - loss: 0.0991 - val_loss: 0.1096
Epoch 3/30
675/675 [==============================] - 1143s - loss: 0.1096 - val_loss: 0.1040
Epoch 4/30
675/675 [==============================] - 1139s - loss: 0.1072 - val_loss: 0.1019
Finished training intermediate1.

1 个答案:

答案 0 :(得分:1)

我认为你对EarlyStopping回调的解释有点过时;当损失没有从{{1>}时代的所见的最佳损失中改善时,它就会停止。你的模型在第1纪元的最佳损失是0.0860,对于第2和第3纪元,损失没有改善,所以它应该在纪元3之后停止训练。但是,它继续训练一个纪元,因为一个关闭 - 一个错误,至少我会称之为文档所说的patience,即:

  

耐心:没有任何改进的时期数量,之后将停止培训。

从Keras源代码(为清晰起见略微编辑):

patience

请注意class EarlyStopping(Callback): def on_epoch_end(self, epoch, logs=None): current = logs.get(self.monitor) if np.less(current - self.min_delta, self.best): self.best = current self.wait = 0 else: if self.wait >= self.patience: self.stopped_epoch = epoch self.model.stop_training = True self.wait += 1 self.wait检查之后增加,所以当你的模型应该在第3纪元之后停止训练时,它会持续一个更多时代。

不幸的是,如果您希望回调的行为与您描述的方式一致,在self.patience时期没有连续改进的情况下停止训练,您必须自己编写。但我认为您可以稍微修改patience回调以实现此目的。

编辑:一分一秒的错误是fixed