如有错误,恳请指出。
开门见山,基于mmdet的官方文档直接介绍如何进行我们的运行配置。个人觉得,继承于default_runtime.py
这个文件之后,主要需要自己稍微更改下的配置主要有7个,分别是:优化器配置、学习率配置、工作流程配置、检查点配置、日志配置、评估配置、训练设置。具体的配置流程如下所示。
如果需要其他钩子函数的实现与配置,具体可以查看参考资料1.
optimizer = dict(type='SGD', lr=0.02, momentum=0.9, weight_decay=0.0001)
optimizer_config = dict(grad_clip=None)
optimizer_config = dict(
_delete_=True, grad_clip=dict(max_norm=35, norm_type=2))
其中,_delete_=True
将用新键替换backbone
字段中的所有旧键
lr_config = dict(
policy='step',
warmup='linear',
warmup_iters=500,
warmup_ratio=0.001,
step=[8, 11]) # 表示初始学习率在第8和11个epoch衰减10倍
还有其他的配置方案:
lr_config = dict(policy='poly', power=0.9, min_lr=1e-4, by_epoch=False)
lr_config = dict(
policy='CosineAnnealing',
warmup='linear',
warmup_iters=1000,
warmup_ratio=1.0 / 10,
min_lr_ratio=1e-5)
支持动量调度器根据学习率修改模型的动量,这可以使模型以更快的方式收敛。Momentum 调度器通常与 LR 调度器一起使用
lr_config = dict(
policy='cyclic',
target_ratio=(10, 1e-4),
cyclic_times=1,
step_ratio_up=0.4,
)
momentum_config = dict(
policy='cyclic',
target_ratio=(0.85 / 0.95, 1),
cyclic_times=1,
step_ratio_up=0.4,
)
工作流是 (phase, epochs)
的列表,用于指定运行顺序和时期。默认情况下,它设置为:
workflow = [('train', 1)]
这意味着运行 1 个 epoch 进行训练。有时用户可能想要检查验证集上模型的一些指标(例如损失、准确性)。在这种情况下,我们可以将工作流设置为
[('train', 1), ('val', 1)]
这样 1 个 epoch 的训练和 1 个 epoch 的验证将被迭代运行。而验证集的损失同样会被计算出来。如果想先进行验证,再进行训练,还可以设置如下:
[('val', 1), ('train', n)]
这样设置表示先对验证集进行验证与损失计算,再进行n个epoch的计算。
checkpoint_config = dict(interval=20) # 20个epoch保存一次权重
参数说明见:https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.CheckpointHook
CLASSmmcv.runner.CheckpointHook(interval: int = - 1, by_epoch: bool = True, save_optimizer: bool = True, out_dir: Optional[str] = None, max_keep_ckpts: int = - 1, save_last: bool = True, sync_buffer: bool = False, file_client_args: Optional[dict] = None, **kwargs)
包装多个记录器log_config
挂钩并允许设置间隔。现在 MMCV 支持WandbLoggerHook
、MlflowLoggerHook
和TensorboardLoggerHook
.
log_config = dict(
interval=50, # 每500个迭代就打印一次训练信息
hooks=[
dict(type='TextLoggerHook'),
# dict(type='TensorboardLoggerHook')
])
参数说明见:https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.EvalHook
CLASSmmcv.runner.LoggerHook(interval: int = 10, ignore_last: bool = True, reset_flag: bool = False, by_epoch: bool = True)[SOURCE]
配置的evaluation
将用于初始化EvalHook
. 除了 key interval
,其他参数如metric将传递给dataset.evaluate()
evaluation = dict(interval=1, metric=‘bbox’)
参数说明:https://mmcv.readthedocs.io/en/latest/api.html?highlight=EpochBasedRunner#mmcv.runner.EpochBasedRunner
mmcv.runner.EvalHook(dataloader: torch.utils.data.dataloader.DataLoader, start: Optional[int] = None, interval: int = 1, by_epoch: bool = True, save_best: Optional[str] = None, rule: Optional[str] = None, test_fn: Optional[Callable] = None, greater_keys: Optional[List[str]] = None, less_keys: Optional[List[str]] = None, out_dir: Optional[str] = None, file_client_args: Optional[dict] = None, **eval_kwargs)
runner = dict(type='EpochBasedRunner', max_epochs=150) # 设置模型训练多少次
参数说明:https://mmcv.readthedocs.io/en/latest/api.html#mmcv.runner.EpochBasedRunner
mmcv.runner.EpochBasedRunner(model: torch.nn.modules.module.Module, batch_processor: Optional[Callable] = None, optimizer: Optional[Union[Dict, torch.optim.optimizer.Optimizer]] = None, work_dir: Optional[str] = None, logger: Optional[logging.Logger] = None, meta: Optional[Dict] = None, max_iters: Optional[int] = None, max_epochs: Optional[int] = None)
总结:
一般来说,我们写配置文件都会继承default_runtime.py
这个文件
_base_ = [
'../_base_/default_runtime.py'
]
这个文件的内容如下所示:
checkpoint_config = dict(interval=5) # 每5个epoch保存一次权重
# yapf:disable
log_config = dict(
interval=50, # 每500个迭代就打印一次训练信息
hooks=[
dict(type='TextLoggerHook'),
# dict(type='TensorboardLoggerHook')
])
# yapf:enable
custom_hooks = [dict(type='NumClassCheckHook')]
dist_params = dict(backend='nccl')
log_level = 'INFO'
load_from = None # 加载权重文件
resume_from = None
workflow = [('train', 1)]
# disable opencv multithreading to avoid system being overloaded
opencv_num_threads = 0
# set multi-process start method as `fork` to speed up the training
mp_start_method = 'fork'
# Default setting for scaling LR automatically
# - `enable` means enable scaling LR automatically
# or not by default.
# - `base_batch_size` = (8 GPUs) x (2 samples per GPU).
auto_scale_lr = dict(enable=False, base_batch_size=16)
一般不需要更改太多的内容,可以时代的更改log_config
进行合理的打印训练信息,还有设置checkpoint_config
进行合理的保存权重文件,其他的设置按默认即可。
下面展示我继承了default_runtime.py
后更改的内容,其实就是更改了以上我所介绍的七点内容:
_base_ = [
'../_base_/default_runtime.py'
]
......
# optimizer
optimizer = dict( # 设置使用AdamW优化器(默认使用的是SGD)
type='AdamW',
lr=0.0001,
weight_decay=0.0001,
paramwise_cfg=dict(custom_keys={'backbone': dict(lr_mult=0.1, decay_mult=1.0)}))
evaluation = dict(interval=5, metric='bbox') # 5个epoch验证一次
optimizer_config = dict(grad_clip=dict(max_norm=0.1, norm_type=2)) # 设置梯度裁剪(default_runtime.py中默认为None)
checkpoint_config = dict(interval=20) # 20个epoch保存一次权重
log_config = dict(interval=50, # 每50次迭代训练就打印一次信息(注意是迭代而不是epoch)
hooks=[dict(type='TextLoggerHook')])
# learning policy
lr_config = dict(policy='step', step=[100]) # 学习率在100个epoch进行衰减
runner = dict(type='EpochBasedRunner', max_epochs=150) # 训练150个epoch
参考资料: