日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer

發(fā)布時間:2023/11/27 生活经验 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

一、代碼結(jié)構(gòu)概覽

1.核心部分

  • configs:儲存各種網(wǎng)絡(luò)的yaml配置文件
  • datasets:存放數(shù)據(jù)集的地方
  • detectron2:運行代碼的核心組件
  • tools:提供了運行代碼的入口以及一切可視化的代碼文件。

2.Tutorial部分

  • demo:顯而易見就是demo
  • docs: 同樣顯而易見。。
  • tests:提供了一些測試代碼
  • projects:提供了真實的項目代碼示例,之后自己的代碼結(jié)構(gòu)可參照這個結(jié)構(gòu)寫。

二、代碼邏輯分析

1.超參數(shù)配置

進(jìn)入tools/train_net.pymain函數(shù),第一行cfg = setup(args)是配置參數(shù)。Detectron2中的參數(shù)配置使用了yacs這個庫,這個庫能夠很好地重用和拼接超參數(shù)文件配置。

我們先看一下detrctron2/config/的文件結(jié)構(gòu):

  • compat.py: 應(yīng)該是對之前的Detectron庫的兼容吧,可忽略。
  • config.py: 定義了一個CfgNode類,這個類繼承自fvcore庫(fb寫的一個共公共庫,提供一些共享的函數(shù),方便各種不同項目使用)中定義的CfgNode,總之就是不斷繼承。。。繼承關(guān)系是這樣的: detrctron2.config.CfgNode->fcvore.common.config.CfgNode->yacs.config.CfgNode->dict 另外該文件還提供了get_cfg()方法,該方法會返回一個含有默認(rèn)配置的CfgNode,而這些默認(rèn)的配置值在下面的default.py中定義了,之所以這樣做是因為要配置的默認(rèn)值太多了,所以為了文檔清晰才寫到了一個新的文件中去,不過,yacs庫的作者也建議這樣做。
  • default.py: 如上面所說,該文件定義了各種參數(shù)的默認(rèn)值。

了解配置函數(shù)的方法后我們再回到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(): 獲取已經(jīng)配置好默認(rèn)參數(shù)的cfg
  • cfg.merge_from_file(args.config_file):config_file是指定的yaml配置文件,通過merge_from_file這個函數(shù)會將yaml文件中指定的超參數(shù)對默認(rèn)值進(jìn)行覆蓋。
  • 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("cfgn",cfg)

那么最后會有

cfg
... (一些默認(rèn)值超參數(shù))
SYSTEM:NUM_GPUS: 8
TRAIN:SCALES: (1,2,3,4)
  • cfg.freeze(): freeze函數(shù)的作用是將超參數(shù)值凍結(jié),避免被程序不小心修改。
  • default_setup(cfg, args):default_setupdetectron2/engine/default.py中提供的一個默認(rèn)配置函數(shù),具體是怎么配置的這里不詳細(xì)說明了。不過需要知道的值這個文件中還提供了很多其他的配置函數(shù),例如還提供了兩個類:DefaultPredictorDefaultTrainer

2.Trainer

既然上面提到了DefaultTrainer,那么我們就從這個類入手了解一下detectron2.engine,其代碼結(jié)構(gòu)如下:

  • train_loop.py: 這個函數(shù)主要作用是提供了三個重要的類:
    • HookBase: 這是一個Hook的基類,用于指定在訓(xùn)練前后或者每一個step前后需要做什么事情,所以根據(jù)特定的需求需要對如下四種方法做不同的定義:before_train,after_train,before_step,after_step。以before_step。
    • TrainerBase: 該類中定義的函數(shù)可以歸納成三種:
      • register_hooks:這個很好理解,就是將用戶定義的一些hooks進(jìn)行注冊,說大白話就是把若干個Hook放在一個list里面去。之后只需要遍歷這個list依次執(zhí)行就可以了。
      • 第二類其實就是上面提到的遍歷hook list并執(zhí)行hook,不過這個遍歷有四種,分別是before_train,after_train,before_step,after_step。還有一個就是run_step,這個函數(shù)其實就是平常我們在編寫訓(xùn)練過程的代碼,例如讀數(shù)據(jù),訓(xùn)練模型,獲取損失值,求導(dǎo)數(shù),反向梯度更新等,只不過在這個類里面沒有定義。
      • 第三類就是train函數(shù),它有兩個參數(shù),分別是開始的迭代數(shù)和最大的迭代數(shù)。之后就是重復(fù)依次執(zhí)行第二類中的函數(shù)指定迭代次數(shù)。
    • SimpleTrainer:其實就是繼承自TrainerBase,然后定義了run_step等方法。我們后面也可以繼承這個類做進(jìn)一步的自定義。
  • defaults.py: 上面已介紹,提供了兩個類:DefaultPredictorDefaultTrainer,這個DefaultTrainer就繼承自SimpleTrainer,所以存在如下繼承關(guān)系: detectron2.engine.default.DefaultTrainer->detectron2.engine.train_loop.SimpleTrainer->detectron2.engine.train_loop.TrainerBase
  • hooks.py:定義了很多繼承自train_loop.HookBase的Hook。
  • launch.py: 前面提到過,可以理解成代碼啟動器,可以根據(jù)命令決定是否采用分布式訓(xùn)練(或者單機(jī)多卡)或者單機(jī)單卡訓(xùn)練。

好了,我們繼續(xù)回到tools/train_net.py的main函數(shù),代碼如下所示。

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。之后只需要調(diào)用trainer.train()就可以開始訓(xùn)練了。

三、小結(jié)

至此我們對detectron2的邏輯有了大致的了解了,那么接下來我們來了解一下detectron2.engine.default.DefaultTrainer是如何解析cfg的,這部分內(nèi)容請參見

Detectron2代碼閱讀筆記-(二) - marsggbo - 博客園?www.cnblogs.com

MARSGGBO?原創(chuàng)
微信公眾號: 【AutoML機(jī)器學(xué)習(xí)】

AutoML機(jī)器學(xué)習(xí)
2019-10-15 10:37:50

總結(jié)

以上是生活随笔為你收集整理的trainer setup_Detectron2源码阅读笔记-(一)Configamp;Trainer的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。