感觉detectron2中用到了许多设计模式。
Registry机制
Hook机制
学习率调度器
学习率调度器机制:https://zh.d2l.ai/chapter_optimization/lr-scheduler.html
如单因子;余弦调度;预热机制。
当使用默认的build方法时,使用cfg来配置
def build_lr_scheduler(cfg: CfgNode, optimizer: torch.optim.Optimizer) -> LRScheduler:
"""
Build a LR scheduler from config.
"""
name = cfg.SOLVER.LR_SCHEDULER_NAME
if name == "WarmupMultiStepLR":
steps = [x for x in cfg.SOLVER.STEPS if x <= cfg.SOLVER.MAX_ITER]
if len(steps) != len(cfg.SOLVER.STEPS):
logger = logging.getLogger(__name__)
logger.warning(
"SOLVER.STEPS contains values larger than SOLVER.MAX_ITER. "
"These values will be ignored."
)
sched = MultiStepParamScheduler(
values=[cfg.SOLVER.GAMMA**k for k in range(len(steps) + 1)],
milestones=steps,
num_updates=cfg.SOLVER.MAX_ITER,
)
elif name == "WarmupCosineLR":
end_value = cfg.SOLVER.BASE_LR_END / cfg.SOLVER.BASE_LR
assert end_value >= 0.0 and end_value <= 1.0, end_value
sched = CosineParamScheduler(1, end_value)
elif name == "WarmupStepWithFixedGammaLR":
sched = StepWithFixedGammaParamScheduler(
base_value=1.0,
gamma=cfg.SOLVER.GAMMA,
num_decays=cfg.SOLVER.NUM_DECAYS,
num_updates=cfg.SOLVER.MAX_ITER,
)
else:
raise ValueError("Unknown LR scheduler: {}".format(name))
sched = WarmupParamScheduler(
sched,
cfg.SOLVER.WARMUP_FACTOR,
min(cfg.SOLVER.WARMUP_ITERS / cfg.SOLVER.MAX_ITER, 1.0),
cfg.SOLVER.WARMUP_METHOD,
cfg.SOLVER.RESCALE_INTERVAL,
)
return LRMultiplier(optimizer, multiplier=sched, max_iter=cfg.SOLVER.MAX_ITER)
可以看出来,它支持的lr_schedular方式有WarmupMultiStepLR,WarmupCosineLR,WarmupStepWithFixedGammaLR,最后返回WarmupParamScheduler wrapper过的sched。
在里面的sched可以是MultiStepParamScheduler、CosineParamScheduler、StepWithFixedGammaParamScheduler。这三个都是fvcore.common.param_scheduler下面的方法了。
在使用WarmupParamScheduler wrapper的过程中,用到cfg中的参数有WARMUP_FACTOR, WARMUP_ITERS, MAX_ITER,WARMUP_METHOD,RESCALE_INTERVAL
class WarmupParamScheduler(CompositeParamScheduler):
"""
Add an initial warmup stage to another scheduler.
"""
def __init__(
self,
scheduler: ParamScheduler,
warmup_factor: float,
warmup_length: float,
warmup_method: str = "linear",
rescale_interval: bool = False,
):
-
warmup_factor
: 预热阶段结束时学习率相对于初始学习率的比例因子。例如,如果初始学习率是 0.01,而warmup_factor
是 0.001,则预热阶段结束时学习率将是 0.01 * 0.001 = 0.00001。 -
warmup_length
: 预热阶段相对于整个训练周期的长度比例。它表示预热阶段应该占整个训练周期的比例。例如,如果warmup_length
是 0.1,则预热阶段将占整个训练周期的 10%。 -
warmup_method
: 预热阶段的方式,有两种选择:"linear"
:线性预热,学习率在预热阶段内线性增加。"constant"
:常数预热,预热阶段内学习率保持不变,等于warmup_factor
乘以初始学习率。
这些参数允许用户自定义预热阶段的具体行为,以满足特定的训练需求和模型架构。