Detectron2源码阅读-一些机制(2)

感觉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 乘以初始学习率。

这些参数允许用户自定义预热阶段的具体行为,以满足特定的训练需求和模型架构。

LazyConfig机制

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值