python - 如何提前停止在 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。为什么这么早就停止了,没有任何通知?
解决方案
对我来说,您的线路按预期工作。由于您没有提供最小的可行示例,如果您自己调试问题,它可能是最简单的。这实际上很容易。
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
推荐阅读
- ios - Swift如何删除作为字典的子值
- r - 具有用户指定条件的均值和标准差
- javascript - 如果无法访问原始代码,是否有 html 或 js 代码为 GoDaddy 模板发送按钮提供视觉焦点
- sql-server - 从另一个表插入日期后创建触发器
- mdx - 如何在数据工厂复制数据期间在 MDX 查询上设置 SAP VARIABLES?
- arduino - 使用类时未初始化 Arduino 上的 LED 引脚
- javascript - 延迟加载条带 - 导致未定义的错误
- algorithm - 获取图中的所有网格(窗口)
- php - 函数 move_uploaded_file(); 不要移动文件
- java - 嵌套在 do-while 循环中的 try-catch 实际上不是循环是否有原因?