跟踪回调函数

根据被监控的指标/损失的行为做出决策的回调函数

源代码

TerminateOnNaNCallback

 TerminateOnNaNCallback (after_create=None, before_fit=None,
                         before_epoch=None, before_train=None,
                         before_batch=None, after_pred=None,
                         after_loss=None, before_backward=None,
                         after_cancel_backward=None, after_backward=None,
                         before_step=None, after_cancel_step=None,
                         after_step=None, after_cancel_batch=None,
                         after_batch=None, after_cancel_train=None,
                         after_train=None, before_validate=None,
                         after_cancel_validate=None, after_validate=None,
                         after_cancel_epoch=None, after_epoch=None,
                         after_cancel_fit=None, after_fit=None)

一个如果损失为 NaN 则终止训练的 Callback

learn = synth_learner()
learn.fit(10, lr=100, cbs=TerminateOnNaNCallback())
周期 训练损失 验证损失 时间
assert len(learn.recorder.losses) < 10 * len(learn.dls.train)
for l in learn.recorder.losses:
    assert not torch.isinf(l) and not torch.isnan(l)

源代码

TrackerCallback

 TrackerCallback (monitor='valid_loss', comp=None, min_delta=0.0,
                  reset_on_fit=True)

一个用于跟踪 monitor 中最佳值的 Callback

类型 默认值 详情
monitor str 验证损失 被监控的值(通常是损失或指标)。
comp NoneType None numpy 比较运算符;如果 monitor 是损失,则为 np.less;如果 monitor 是指标,则为 np.greater。
min_delta float 0.0 上次 monitor 值与最佳 monitor 值之间的最小差值。
reset_on_fit bool True 在模型拟合之前,将被监控值重置为负无穷(如果 monitor 是指标)或正无穷(如果 monitor 是损失)。

当实现一个行为取决于指标或损失最佳值的 Callback 时,继承此类 Callback 并使用其 best(目前最佳值)和 new_best(本周期有新的最佳值)属性。如果您想在随后的 fit 调用中(例如 Learner.fit_one_cycle)保持 best,请将 reset_on_fit 设置为 True。

comp 是用于确定一个值是否比另一个值更好的比较运算符(如果 monitor 参数名称中包含 'loss',则默认为 np.less,否则为 np.greater);min_delta 是一个可选的浮点数,要求新值比当前最佳值(取决于 comp)至少改进该量。


源代码

EarlyStoppingCallback

 EarlyStoppingCallback (monitor='valid_loss', comp=None, min_delta=0.0,
                        patience=1, reset_on_fit=True)

一个当被监控指标停止改善时终止训练的 TrackerCallback

类型 默认值 详情
monitor str 验证损失 被监控的值(通常是损失或指标)。
comp NoneType None numpy 比较运算符;如果 monitor 是损失,则为 np.less;如果 monitor 是指标,则为 np.greater。
min_delta float 0.0 上次 monitor 值与最佳 monitor 值之间的最小差值。
patience int 1 训练未改进模型时等待的周期数。
reset_on_fit bool True 在模型拟合之前,将被监控值重置为负无穷(如果 monitor 是指标)或正无穷(如果 monitor 是损失)。

comp 是用于确定一个值是否比另一个值更好的比较运算符(如果 monitor 参数名称中包含 'loss',则默认为 np.less,否则为 np.greater);min_delta 是一个可选的浮点数,要求新值比当前最佳值(取决于 comp)至少改进该量。patience 是您愿意在没有改善的情况下等待的周期数。

learn = synth_learner(n_trn=2, metrics=F.mse_loss)
learn.fit(n_epoch=200, lr=1e-7, cbs=EarlyStoppingCallback(monitor='mse_loss', min_delta=0.1, patience=2))
周期 训练损失 验证损失 mse_loss 时间
0 20.437918 26.406773 26.406773 00:00
1 20.418514 26.406715 26.406715 00:00
2 20.410892 26.406639 26.406639 00:00
No improvement since epoch 0: early stopping
learn.validate()
(#2) [26.406639099121094,26.406639099121094]
learn = synth_learner(n_trn=2)
learn.fit(n_epoch=200, lr=1e-7, cbs=EarlyStoppingCallback(monitor='valid_loss', min_delta=0.1, patience=2))
周期 训练损失 验证损失 时间
0 13.408870 19.617222 00:00
1 13.403553 19.617184 00:00
2 13.403143 19.617126 00:00
No improvement since epoch 0: early stopping

源代码

SaveModelCallback

 SaveModelCallback (monitor='valid_loss', comp=None, min_delta=0.0,
                    fname='model', every_epoch=False, at_end=False,
                    with_opt=False, reset_on_fit=True)

一个在训练期间保存模型最佳状态并在结束时加载它的 TrackerCallback

类型 默认值 详情
monitor str 验证损失 被监控的值(通常是损失或指标)。
comp NoneType None numpy 比较运算符;如果 monitor 是损失,则为 np.less;如果 monitor 是指标,则为 np.greater。
min_delta float 0.0 上次 monitor 值与最佳 monitor 值之间的最小差值。
fname str 模型 保存模型时使用的模型名称。
every_epoch bool False 如果为 true,则在每个周期后保存模型;否则仅在模型优于现有最佳模型时保存。
at_end bool False 如果为 true,则在训练结束时保存模型;否则如果只保存了一个模型,则加载最佳模型。
with_opt bool False 如果为 true,则在保存模型时保存优化器状态(如果可用)。
reset_on_fit bool True 在模型拟合之前,将被监控值重置为负无穷(如果 monitor 是指标)或正无穷(如果 monitor 是损失)。

comp 是用于确定一个值是否比另一个值更好的比较运算符(如果 monitor 参数名称中包含 'loss',则默认为 np.less,否则为 np.greater);min_delta 是一个可选的浮点数,要求新值比当前最佳值(取决于 comp)至少改进该量。模型将保存在 learn.path/learn.model_dir/name.pth 中,如果 every_epochTrue 则每个周期保存一次,如果向 every_epoch 传递整数则每 n 个周期保存一次,或者在被监控指标每次改进时保存。

learn = synth_learner(n_trn=2, path=Path.cwd()/'tmp')
learn.fit(n_epoch=2, cbs=SaveModelCallback())
assert (Path.cwd()/'tmp/models/model.pth').exists()
learn = synth_learner(n_trn=2, path=Path.cwd()/'tmp')
learn.fit(n_epoch=2, cbs=SaveModelCallback(fname='end',at_end=True))
assert (Path.cwd()/'tmp/models/end.pth').exists()
learn.fit(n_epoch=2, cbs=SaveModelCallback(every_epoch=True))
for i in range(2): assert (Path.cwd()/f'tmp/models/model_{i}.pth').exists()
shutil.rmtree(Path.cwd()/'tmp')
learn.fit(n_epoch=4, cbs=SaveModelCallback(every_epoch=2))
for i in range(4): 
    if not i%2: assert (Path.cwd()/f'tmp/models/model_{i}.pth').exists()
    else:       assert not (Path.cwd()/f'tmp/models/model_{i}.pth').exists()
shutil.rmtree(Path.cwd()/'tmp')
周期 训练损失 验证损失 时间
0 19.453270 12.539286 00:00
1 19.248507 12.123456 00:00
Better model found at epoch 0 with valid_loss value: 12.539285659790039.
Better model found at epoch 1 with valid_loss value: 12.123456001281738.
周期 训练损失 验证损失 时间
0 5.197007 5.579152 00:00
1 5.154862 5.445522 00:00
Better model found at epoch 0 with valid_loss value: 5.5791521072387695.
Better model found at epoch 1 with valid_loss value: 5.445522308349609.
周期 训练损失 验证损失 时间
0 4.982775 5.264440 00:00
1 4.887252 5.038480 00:00
周期 训练损失 验证损失 时间
0 4.578584 4.781651 00:00
1 4.454868 4.507101 00:00
2 4.322047 4.232390 00:00
3 4.186467 3.957614 00:00

ReduceLROnPlateau


源代码

ReduceLROnPlateau

 ReduceLROnPlateau (monitor='valid_loss', comp=None, min_delta=0.0,
                    patience=1, factor=10.0, min_lr=0, reset_on_fit=True)

一个当指标停止改善时降低学习率的 TrackerCallback

类型 默认值 详情
monitor str 验证损失 被监控的值(通常是损失或指标)。
comp NoneType None numpy 比较运算符;如果 monitor 是损失,则为 np.less;如果 monitor 是指标,则为 np.greater。
min_delta float 0.0 上次 monitor 值与最佳 monitor 值之间的最小差值。
patience int 1 训练未改进模型时等待的周期数。
factor float 10.0 降低学习率时,用作学习率除数的因子。
min_lr int 0 允许的最小学习率;学习率不能低于此最小值。
reset_on_fit bool True 在模型拟合之前,将被监控值重置为负无穷(如果 monitor 是指标)或正无穷(如果 monitor 是损失)。
learn = synth_learner(n_trn=2)
learn.fit(n_epoch=4, lr=1e-7, cbs=ReduceLROnPlateau(monitor='valid_loss', min_delta=0.1, patience=2))
周期 训练损失 验证损失 时间
0 6.122743 7.348515 00:00
1 6.119377 7.348499 00:00
2 6.125790 7.348477 00:00
3 6.131386 7.348475 00:00
Epoch 2: reducing lr to 1e-08
learn = synth_learner(n_trn=2)
learn.fit(n_epoch=6, lr=5e-8, cbs=ReduceLROnPlateau(monitor='valid_loss', min_delta=0.1, patience=2, min_lr=1e-8))
周期 训练损失 验证损失 时间
0 16.747515 15.265999 00:00
1 16.725756 15.265974 00:00
2 16.735016 15.265943 00:00
3 16.733360 15.265934 00:00
4 16.733513 15.265925 00:00
5 16.730352 15.265915 00:00
Epoch 2: reducing lr to 1e-08

这三个派生的 TrackerCallbackSaveModelCallbackReduceLROnPlateuEarlyStoppingCallback)都经过调整的顺序,以便它们可以相互运行而不会互相干扰。该顺序如下

注意

括号中是实际的 Callback 顺序号

  1. TrackerCallback (60)
  2. SaveModelCallback (61)
  3. ReduceLrOnPlateu (62)
  4. EarlyStoppingCallback (63)