【问题标题】:Fast.Ai EarlyStoppingCallback does not workFast.Ai EarlyStoppingCallback 不起作用
【发布时间】:2019-12-29 06:28:59
【问题描述】:

callbacks = [EarlyStoppingCallback(learn, monitor='error_rate', min_delta=1e-5, patience=5)]
learn.fit_one_cycle(30, callbacks=callbacks, max_lr=slice(1e-5,1e-3))

如您所见,我使用了耐心 = 5 和 min_delta=1e-5 和 monitor='error_rate'

我的理解是:如果监控值的改进小于 min_delta,耐心告诉它等待多少个 epoch,在这种情况下是 error_rate。

所以如果我的理解是正确的,那么它不会停留在 Epoch 6。

这是我的理解错误还是fast.ai lib中的调试?

【问题讨论】:

  • 建议几个写作技巧:(1)文本数据最好以文本形式呈现——请删除图像并改用格式化工具; (2) please-help-me 请求在这里是无关的,不应添加。技术写作优先。
  • 嗨@halfer 感谢告知。我会记住的。由于文本数据已经丢失,我下次再做。至于第 2 点,我认为我没有“请帮助我”的请求。如果你认为有,请告诉我。谢谢
  • 没问题。我之前编辑了帖子,删除了“有人可以帮忙吗?”。
  • @halfer 哦~~谢谢~!

标签: machine-learning pytorch fast-ai


【解决方案1】:

它跟踪最佳错误率并将min_delta 与此时期与该值之间的差异进行比较:

class EarlyStoppingCallback(TrackerCallback):
...
if self.operator(current - self.min_delta, self.best):
    self.best,self.wait = current,0
else:
    self.wait += 1
    if self.wait > self.patience:
        print(f'Epoch {epoch}: early stopping')
        return {"stop_training":True}
...

所以self.wait 仅在误差减少足够大的情况下才会增加。一旦第 5 次发生,它就会停止。

np.greater(0.000638 - 1e-5, 0.000729)
False

但似乎确实存在问题,因为显然如果错误率跳得非常高,我们不希望将其分配给self.best。而且我相信这个回调的目的是在错误率开始增加时停止训练——现在它正在做相反的事情。

所以在TrackerCallback 中可能需要更改:

mode_dict['auto'] = np.less if 'loss' in self.monitor else np.greater

mode_dict['auto'] = np.less if 'loss' in self.monitor or 'error' in self.monitor else np.greater

【讨论】:

  • 其实self.operator应该是np.greater()作为mode='auto'
  • 您好,感谢您的更新。我已经为此提交了我的 PR。只有微小的区别:np.less if 'loss' or 'error' in self.monitor ....。还有一种解决方法是:设置 mode='min'
  • 另外,self.wait 不会减少,它会从代码中重置为 0。
  • @Franva 我认为这是有目的的,因为您希望在错误率 consistently 在一定次数的迭代中增加时提前停止
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多