首页 > 解决方案 > 如何提前停止在 Keras 中的模型训练?

问题描述

一旦准确度“acc”达到某个值(在我的情况下为 0.9),我想停止在 Keras 中的模型训练。我想应用 EarlyStopping 回调,但还没有成功。我认为以下就足够了:

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

训练在一个 epoch 后停止,精度为 0.34,没有任何通知(认为详细 = 2)。我试图添加一个 min_delta = 0.1 以期望这个规则只会在达到基线后应用,但这并没有帮助。手册说:

基线:监控量要达到的基线值。如果模型没有显示出对基线的改进,则训练将停止。

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

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

标签: pythonkeras

解决方案


对我来说,您的线路按预期工作。由于您没有提供最小的可行示例,如果您自己调试问题,它可能是最简单的。这实际上很容易。

model.fit在您调用并运行您的代码之前添加此行:

import ipdb; ipdb.set_trace()

您现在将获得 ipdb-prompt。输入这个:

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

推荐阅读