如何提前停止在Keras进行模型训练?

时间:2018-10-26 09:38:41

标签: python keras

我想在精度“ acc”达到一定值(在我的情况下为0.9)时立即停止在Keras进行模型训练。我想应用EarlyStopping回调,但尚未成功。我以为满足以下条件:

    early_stopping = EarlyStopping(
            monitor = 'acc',
            verbose = 2,
            mode = 'max',
            baseline = 0.9
    )

一个纪元后,训练停止,准确度为0.34,恕不另行通知(认为详细= 2)。我试图添加一个min_delta = 0.1,期望该规则仅在达到基线后才适用,但这无济于事。手册说:

  

基准:要达到的监视数量的基准值。如果模型没有显示出超过基线的改善,培训将停止。

  

模式:{auto,min,max}之一。 ...在最大模式下,当监视的数量停止增加时,它将停止...

从以前的运行中,我知道我的模型将在大约25个时期内增加到1.00。为什么它这么早就停止了而没有任何通知?

1 个答案:

答案 0 :(得分:1)

对我来说,您的电话线运作正常。由于您没有提供minimal workable example,因此,如果您自己调试问题,这可能是最简单的。其实很简单。

在致电model.fit之前添加此行并运行代码:

import ipdb; ipdb.set_trace()

您现在将获得ipdb提示。输入以下内容:

ipdb> b EarlyStopping.on_epoch_end
ipdb> c

现在,您的程序应运行到断点。现在,您可以使用n逐步执行代码以前进一行,并且可以使用p打印变量。这是一个示例,当前的最佳精度是多少,当前历元的新值是什么?

    543         if self.monitor_op(current - self.min_delta, self.best):
--> 544             self.best = current
    545             self.wait = 0

ipdb> p self.best
0.9
ipdb> p current
0.9196166666348775

通过这种方式,您可以检查代码所采用的路径,以及偏离您期望的位置。如果这不足以解决您的问题,那么其他信息肯定会对其他人有帮助,从而帮助您解决问题。

更新: 你是对的。它实际上没有按预期方式工作。在我做的测试中,它恰好在正确的时间停止。但是,使用原始类作为模板,可以轻松创建自己的类,从而获得以下行为:

class CustomEarlyStopping(EarlyStopping):
    def __init__(self, threshold):
        self.threshold = threshold
        super(CustomEarlyStopping, self).__init__(monitor='acc')

    def on_epoch_end(self, epoch, logs=None):
        current = self.get_monitor_value(logs)
        if current is None:
            return

        if current >= self.threshold:
            self.stopped_epoch = epoch
            self.model.stop_training = True