如何修改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
相关产品推荐
相关产品推荐

