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,则等待多少个时期,在这种情况下为error_rate。
因此,如果我的理解是正确的,那么它将不会止于纪元6。
这是我的理解错误还是在fast.ai lib中进行调试?
答案 0 :(得分: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