我的模型在第4个时期后停止训练,尽管我希望它能继续进行训练。我将Monitor的验证损失设置为2,耐心性设置为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)

我不明白为什么训练会在第四个纪元后结束。
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.

最佳答案

我认为您对EarlyStopping回调的解释有些偏离;当损失没有从patience时期所见过的最佳损失中得到改善时,它将停止。您的模型的最佳损失是在第1阶段为0.0860,对于第2阶段和第3阶段,损失没有改善,因此它应该在第3阶段后停止训练。但是,由于偏离,它继续训练了另一个-一个错误,考虑到文档所说的patience,至少我会这样称呼它:



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

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进行检查之后,self.patience才会增加,因此,虽然模型应该在第3阶段后停止训练,但模型又持续了一个时期。

不幸的是,如果您想要一个按照您所描述的方式运行的回调,而在没有持续改善patience时期的情况下停止训练,则您必须自己编写它。但是我认为您可以稍微修改EarlyStopping回调来完成此操作。

编辑:偏离一的错误是fixed

关于python - 在Keras中神秘地表现的EarlyStopping回调,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46656948/

10-11 23:17