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