MMDetection-运行时
簡介
在之前的文章中,已經介紹了配置文件、數據、模型等方面的內容,在配置文件那篇文章中其實簡單介紹了部分運行時相關的內容,本文將詳細展開。需要說明的時,官方是將runtime與schedule區分開的,不過從配置繼承的角度來看,它們可以放到一起,因此本文都將其視為運行時配置。
運行時定制
自定義優化器
MMDetection支持所有的PyTorch定義的優化器(optimizer),如果想要使用某個優化器只需要修改配置文件中optimizer字段即可,比如想要使用Adam優化器則在配置文件中寫入下面一行。
optimizer = dict(type='Adam', lr=0.0003, weight_decay=0.0001)當然,往往我們需要使用自己實現的優化器,那么按照規范,需要在項目根目錄下的mmdet/core/optimizer/下創建自定義的Python腳本,如mmdet/core/optimizer/my_optimizer.py文件并寫入如下內容,創建自定義MyOptimizer的方式和PyTorch中類似,只是需要注冊為MMDetection識別的OPTIMIZERS即可。
from .registry import OPTIMIZERS from torch.optim import Optimizer@OPTIMIZERS.register_module() class MyOptimizer(Optimizer):def __init__(self, a, b, c):pass然后,為了能夠在配置文件中找到這個優化器,需要在mmdet/core/optimizer/__init__.py文件中導入該優化器,也就是添加下面的一行內容。
from .my_optimizer import MyOptimizer此時,就可以在配置文件中修改optimizer字段來使用自定義的優化器了,示例如下。
optimizer = dict(type='MyOptimizer', a=a_value, b=b_value, c=c_value)除了自定義優化器,我們有時候還需要對優化器進行一些額外配置,這是官方優化器并沒有實現的功能,就需要通過optimizer constructor(優化器構建器)來實現,常用的一些trick如下。
-
梯度裁剪
在配置文件中添加如下字段,其中的grad_clip參數控制梯度裁剪。
optimizer_config = dict(_delete_=True, grad_clip=dict(max_norm=35, norm_type=2)) -
動量調度
MMDetection支持依據學習率動態調整動量使得訓練收斂加快,示例如下。
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, )
自定義訓練調度
默認情況下,我們使用的是configs/_base_/schedules/schedule_1x.py中的調度設置,這是默認的Step LR調度,在MMCV中為StepLRHook,同時MMDetection也支持其他的調度器,如余弦調度(CosineAnneaing),在配置文件中及那個lr_config字段修改如下即可使用余弦調度。
lr_config = dict(policy='CosineAnnealing',warmup='linear',warmup_iters=1000,warmup_ratio=1.0 / 10,min_lr_ratio=1e-5)自定義工作流
在MMDetection中,工作流決定整體的工作流程(包括運行順序和輪數),它是一個元素格式為(phase, epochs)的列表。默認情況下其設置為workflow = [('train', 1)],這表示僅僅運行一輪訓練,常常我們需要在驗證集上評估模型的泛化能力(通過計算某些metric),此時可以設置工作流為[('train', 1), ('val', 1)],這樣就會迭代進行一輪訓練一輪驗證。需要注意的是,這里控制的只是一次操作,也就是說,它是不能控制整個調度的,如[('train', 2), ('val', 1)]表示每訓練兩輪進行一輪驗證。
此外還需要注意,驗證時不會更新模型參數,且我們是通過total_epochs字段控制訓練總倫數的,這不會影響驗證工作流的進行。
Hook
自定義Hook的內容可以參考MMCV的教程,這里不多贅述,介紹幾個常用的Hook,它們由MMCV定義,只需要在配置文件中添加對應內容即可應用。比如我們想要在配置中使用MMCV自定義的NumClassCheckHook來檢查head中的num_classes是否匹配dataset中的CLASSES長度,那么可以在 default_runtime.py中添加如下字段。
此外,還有不少常用的hook沒有注冊在custom_hooks中,主要有如下的幾種。
- log_config
- checkpoint_config
- evaluation
- lr_config
- optimizer_config
- momentum_config
其中,optimizer_config、momentum_config和lr_config上文已經涉及了,這里不再介紹,介紹剩下的三個的作用。
Checkpoint config來源于MMCV中的CheckpointHook,用于控制模型參數的本地保存,可以在配置文件中添加如下字段來設置,其中常用的參數有三個,interval表示保存頻率(多少輪進行一次保存),save_optimizer表示是否保存優化器參數,max_keep_ckpts表示最大保存數目(常常我們只需要最后的幾個模型,不需要所有輪的)。
checkpoint_config = dict(interval=1, save_optimizer=True, max_keep_ckpts=-1)log_config是很多logger hooks的包裝器并且統一設置保存頻率(interval同上),用于訓練記錄日志的保存,目前MMCV支持了三種WandbLoggerHook、MlflowLoggerHook和TensorboardLoggerHook,默認MMDetection設置的日志記錄配置如下,只以文本的方式記錄訓練日志,建議打開Tensorboard記錄。
log_config = dict(interval=50,hooks=[dict(type='TextLoggerHook'),# dict(type='TensorboardLoggerHook')])evaluation字段用來初始化EvalHook控制模型的評估,除了上面的interval外,你還需要設置如評估指標metric來傳遞給dataset.evaluate()方法, 默認的評估設置如下。
evaluation = dict(interval=1, metric='bbox')總結
本文介紹了MMDetection中運行時相關的配置,官方教程也有對應。最后,如果我的文章對你有所幫助,歡迎點贊收藏評論一鍵三連,你的支持是我不懈創作的動力。
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的MMDetection-运行时的全部內容,希望文章能夠幫你解決所遇到的問題。