【mmcv、mmdetection、mmaction】训练深度学习模型时如何自定义优化器“optimizer”,为模型不同layer设置不同的学习率

mmaction, mmdetection的代码库使用mmcv代码构建了深度学习训练框架,其中主要的类是’runner’ 。model和optimizer都是runner的成员。

默认configs下,optimizer通过传入字典参数
optimizer = dict(type=‘SGD’, lr=0.1, momentum=0.9, weight_decay=0.0005)
进行初始化。此时,整个模型的学习率都是0.1,不可对复杂模型的不同层/参数设定不同的学习率lr。

本文展示了如何解决这一问题:
先通过常规的操作自定义optimizer, 另外,在初始化runner类的时候,不要传入optimizer的配置参数,而是传入None(此时,runner类不会初始化optimizer成员)。此时,将自定义的optimizer给runner即可。完成自mmcv框架下自定义optimizer优化器

# 自定义一个optimizer
 param_group = []
    param_group += [{'params': model.backbone.parameters(), 'lr': cfg.optimizer.lr[0]}]
    param_group += [{'params': model.neck.parameters(), 'lr': cfg.optimizer.lr[1]*10}]
#初始化一个自定义的optimizer
       optimizer = torch.optim.SGD(param_group, cfg.optimizer.lr[1],momentum=0.9, weight_decay=0.0005)
       
    # put model on gpus
    model = MMDistributedDataParallel(model.cuda())
    # 在mmcv mmaction 默认参数下, 如果想要不同层有不同学习率,只需将optimizer dict()中lr改为一个包含多个lr的list。
    if isinstance(cfg.optimizer.lr,list):
        # build runner# make the optimizer to be None, we custom new optimizer
        runner = Runner(model, batch_processor, None, cfg.work_dir,
                        cfg.log_level)
        # 使用自定义的optimizer,借此实现同一个模型中设置多个学习率训练
        runner.optimizer = optimizer
    else:
    	# mmaction / api /train 中的默认代码,使用默认参数文件cfg.optimizer直接初始化了optimizer
        runner = Runner(model, batch_processor, cfg.optimizer, cfg.work_dir,
                        cfg.log_level)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值