您好,登錄后才能下訂單哦!
這篇文章主要講解了“什么是Config和Trainer”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“什么是Config和Trainer”吧!
configs:儲存各種網絡的yaml配置文件
datasets:存放數據集的地方
detectron2:運行代碼的核心組件
tools:提供了運行代碼的入口以及一切可視化的代碼文件。
demo:顯而易見就是demo
docs: 同樣顯而易見。。
tests:提供了一些測試代碼
projects:提供了真實的項目代碼示例,之后自己的代碼結構可參照這個結構寫。
進入tools/train_net.py
的main函數,第一行cfg = setup(args)
是配置參數。Detectron2中的參數配置使用了yacs這個庫,這個庫能夠很好地重用和拼接超參數文件配置。
我們先看一下detrctron2/config/
的文件結構:
compat.py
: 應該是對之前的Detectron庫的兼容吧,可忽略。三門峽婦科醫院http://www.0398hfyy.com/
config.py
: 定義了一個CfgNode
類,這個類繼承自fvcore
庫(fb寫的一個共公共庫,提供一些共享的函數,方便各種不同項目使用)中定義的CfgNode
,總之就是不斷繼承。。。繼承關系是這樣的:
detrctron2.config.CfgNode->fcvore.common.config.CfgNode->yacs.config.CfgNode->dict
另外該文件還提供了get_cfg()
方法,該方法會返回一個含有默認配置的CfgNode
,而這些默認的配置值在下面的default.py
中定義了,之所以這樣做是因為要配置的默認值太多了,所以為了文檔清晰才寫到了一個新的文件中去,不過,yacs
庫的作者也建議這樣做。
default.py
: 如上面所說,該文件定義了各種參數的默認值。
了解配置函數的方法后我們再回到tools/train_net.py
,我們一行一行的來理解。
tools/train_net.py
from detectron2.config import get_cfg from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, hooks, launch ... def setup(args): """ Create configs and perform basic setups. """ cfg = get_cfg() cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) cfg.freeze() default_setup(cfg, args) return cfg
cfg = get_cfg(): 獲取已經配置好默認參數的cfg
cfg.merge_from_file(args.config_file):config_file是指定的yaml配置文件,通過merge_from_file
這個函數會將yaml文件中指定的超參數對默認值進行覆蓋。
cfg.merge_from_list(args.opts):merge_from_list
作用同上面的類似,只不過是通過命令行的方式覆蓋。
例如
opts = ["SYSTEM.NUM_GPUS", 8, "TRAIN.SCALES", "(1, 2, 3, 4)"] cfg.merge_from_list(opts) print("cfg\n",cfg)
那么最后會有
cfg ... (一些默認值超參數) SYSTEM: NUM_GPUS: 8 TRAIN: SCALES: (1,2,3,4)
cfg.freeze(): freeze函數的作用是將超參數值凍結,避免被程序不小心修改。
default_setup(cfg, args):default_setup
是detectron2/engine/default.py
中提供的一個默認配置函數,具體是怎么配置的這里不詳細說明了。不過需要知道的值這個文件中還提供了很多其他的配置函數,例如還提供了兩個類:DefaultPredictor
和DefaultTrainer
。
既然上面提到了DefaultTrainer
,那么我們就從這個類入手了解一下detectron2.engine
,其代碼結構如下:
train_loop.py
: 這個函數主要作用是提供了三個重要的類:
register_hooks
:這個很好理解,就是將用戶定義的一些hooks進行注冊,說大白話就是把若干個Hook放在一個list里面去。之后只需要遍歷這個list依次執行就可以了。
第二類其實就是上面提到的遍歷hook list并執行hook,不過這個遍歷有四種,分別是before_train
,after_train
,before_step
,after_step
。還有一個就是run_step
,這個函數其實就是平常我們在編寫訓練過程的代碼,例如讀數據,訓練模型,獲取損失值,求導數,反向梯度更新等,只不過在這個類里面沒有定義。
第三類就是train
函數,它有兩個參數,分別是開始的迭代數和最大的迭代數。之后就是重復依次執行第二類中的函數指定迭代次數。
HookBase
: 這是一個Hook的基類,用于指定在訓練前后或者每一個step前后需要做什么事情,所以根據特定的需求需要對如下四種方法做不同的定義:before_train
,after_train
,before_step
,after_step
。以before_step
。
TrainerBase
: 該類中定義的函數可以歸納成三種:
SimpleTrainer
:其實就是繼承自TrainerBase
,然后定義了run_step
等方法。我們后面也可以繼承這個類做進一步的自定義。
defaults.py
: 上面已介紹,提供了兩個類:DefaultPredictor
和DefaultTrainer
,這個DefaultTrainer
就繼承自SimpleTrainer
,所以存在如下繼承關系:
detectron2.engine.default.DefaultTrainer->detectron2.engine.train_loop.SimpleTrainer->detectron2.engine.train_loop.TrainerBase
hooks.py
:定義了很多繼承自train_loop.HookBase
的Hook。
launch.py
: 前面提到過,可以理解成代碼啟動器,可以根據命令決定是否采用分布式訓練(或者單機多卡)或者單機單卡訓練。
好了,我們繼續回到tools/train_net.py
的main函數,代碼如下所示。
def main(args): cfg = setup(args) if args.eval_only: ... trainer = Trainer(cfg) trainer.resume_or_load(resume=args.resume) if cfg.TEST.AUG.ENABLED: trainer.register_hooks( [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))] ) return trainer.train()
可以看到下面定義了一個Trainer
,它繼承自detectron2.engine.default.DefaultTrainer
,這個父類會自動解析cfg。之后只需要調用trainer.train()
就可以開始訓練了。
感謝各位的閱讀,以上就是“什么是Config和Trainer”的內容了,經過本文的學習后,相信大家對什么是Config和Trainer這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。