代码之家  ›  专栏  ›  技术社区  ›  Arnold

我该如何尽早停止在凯拉斯的模特训练?

  •  0
  • Arnold  · 技术社区  · 6 年前

    我想在精度“acc”达到某个值(在我的例子中是0.9)时,立即停止我在Keras中的模型训练。我想应用earlystoping回调,但还没有成功。我认为以下几点就足够了:

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

    基线:要达到的监控量的基线值。如果模型没有显示出比基线有所改善,培训将停止。

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   sietschie    6 年前

    对我来说,你的台词和预期的一样。因为你没有提供 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