You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改Detectron2中的默认优化器?

在Detectron2中替换默认优化器为Adam的解决方案

1. 配置文件设置

在你的Detectron2配置文件(如自定义yaml或Base系列配置)中添加以下参数:

SOLVER:
  OPTIMIZER: "ADAM"
  BASE_LR: 0.0001  # Adam学习率通常远低于SGD,需根据任务调整
  WEIGHT_DECAY: 0.0005
  # Adam自带动量相关机制,无需设置MOMENTUM参数

2. 自定义优化器构建逻辑

默认的build_optimizer函数仅支持SGD,需要扩展它来适配Adam,以下是两种常用实现方式:

方式一:重写DefaultTrainer的build_optimizer方法

自定义训练器类,替换优化器构建逻辑:

from detectron2.engine import DefaultTrainer
from detectron2.solver.build import get_default_optimizer_params
from torch.optim import Adam

class CustomTrainer(DefaultTrainer):
    @classmethod
    def build_optimizer(cls, cfg, model):
        # 沿用Detectron2默认的参数分组逻辑,处理权重衰减、偏置学习率差异等
        params = get_default_optimizer_params(
            model,
            base_lr=cfg.SOLVER.BASE_LR,
            weight_decay=cfg.SOLVER.WEIGHT_DECAY,
            weight_decay_norm=cfg.SOLVER.WEIGHT_DECAY_NORM,
            bias_lr_factor=cfg.SOLVER.BIAS_LR_FACTOR,
            weight_decay_bias=cfg.SOLVER.WEIGHT_DECAY_BIAS,
        )
        # 返回Adam优化器
        return Adam(params, lr=cfg.SOLVER.BASE_LR, weight_decay=cfg.SOLVER.WEIGHT_DECAY)

使用自定义训练器启动训练:

if __name__ == "__main__":
    cfg = get_cfg()
    cfg.merge_from_file("path/to/your/config.yaml")
    cfg.freeze()

    trainer = CustomTrainer(cfg)
    trainer.resume_or_load(resume=False)
    trainer.train()

方式二:直接替换默认构建函数

如果不想自定义Trainer,可直接在训练脚本中替换build_optimizer的实现:

from detectron2.solver.build import get_default_optimizer_params
from torch.optim import Adam
from detectron2.engine import DefaultTrainer

def build_adam_optimizer(cfg, model):
    params = get_default_optimizer_params(
        model,
        base_lr=cfg.SOLVER.BASE_LR,
        weight_decay=cfg.SOLVER.WEIGHT_DECAY,
        weight_decay_norm=cfg.SOLVER.WEIGHT_DECAY_NORM,
        bias_lr_factor=cfg.SOLVER.BIAS_LR_FACTOR,
        weight_decay_bias=cfg.SOLVER.WEIGHT_DECAY_BIAS,
    )
    return Adam(params, lr=cfg.SOLVER.BASE_LR, weight_decay=cfg.SOLVER.WEIGHT_DECAY)

# 替换DefaultTrainer的默认优化器构建方法
DefaultTrainer.build_optimizer = build_adam_optimizer

# 常规训练流程
cfg = get_cfg()
cfg.merge_from_file("path/to/your/config.yaml")
cfg.freeze()

trainer = DefaultTrainer(cfg)
trainer.resume_or_load(resume=False)
trainer.train()

3. 关键注意事项

  • 学习率调整:Adam的最优学习率远低于SGD(SGD常用0.002,Adam建议从0.0001开始尝试),需根据验证集性能微调。
  • 动量参数:Adam的动量由自身betas参数控制(默认(0.9, 0.999)),无需设置Detectron2的SOLVER.MOMENTUM。
  • 参数分组保留:必须使用get_default_optimizer_params获取参数列表,否则会丢失Detectron2对偏置、归一化层的特殊优化逻辑,可能导致训练不稳定。

内容的提问来源于stack exchange,提问作者muhammad ali

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 20:39:15