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)