darknet源碼該如何解讀?

Deep Learning小白一個,最近因為項目的關係在讀darknet的源碼,但是發現作者並沒有任何的指引或者tutorial,想請教一下各位大牛有沒有了解過源碼的功能,主要是希望能清楚各個函數的作用以及輸入,輸出的含義。darknet/src at master · pjreddie/darknet · GitHub


darknet 中最重要的三個struct定義是 network_state, network, layer; 新版本network_state 已經併入到 network 里去了。

代碼可以先忽略 gpu 部分,不同種類的網路層都是通過 layer 裡面的函數指針 forward backward 和 update 定義本種類的執行規則。如 connected layer 就有 forward_connected_layer backward_connected_layer update_connected_layer 三個方法,gru layer 等也是一樣;

原子運算只在 blas.c 和 gemm.c 里,網路的運算在 network.c 中,最重要的是 train_network_datum ,train_networks, train_network_batch 和 network_predict;

train_network_datum 是輸入數據用 float_pair , 就是 float *x , float *y 結對;

train_networks 是在 network_kernel.cu 里,以並發線程方式進行訓練,參數是 data ;

有一點, darknet 在CPU模式下是單線程的,在多塊GPU顯卡模式下,train_networks支持多卡運行,而且這裡也是改造成分散式多主機darknet運行的入口,可以看到訓練出的權重數據合併和scale。

train_network_datum 順序執行 forward_network { 逐層正向網路 } backward_network { 逐層逆向網路 },滿足次數下(*net.seen %subdivisions)執行一次 update_network( ,,, rate, momentum, decay);

對於用戶定義的網路參數文件處理在 parse_network_cfg, 讀入訓練結果通過 load_weights

主幹就是這些了。

如果需要處理特別需求的數據源,需要參考 data.c 入手。

對 cfg 配置文件,重點調整(當然是全部參數都很重要,可能都要調整),訓練時調整重點的全局參數: decay momentum learning_rate 這三個是與收斂速度有關的。policy 是weights 策略的, inputs batch(及相關的subdivisions) ouputs 是與數據吞吐維度相關的,最新版本好像ouputs這裡有改正。


或許移步此處有點幫助:hgpvision/darknet,目前完成了卷積神經網路涉及的大部分源碼的分析與解讀,後續會持續更新,有些理解可能有出入,也有些問題還沒理解,歡迎交流,希望可以多幾個人討論。


樓主可以參考該博主發表的系列論文 YOLO源碼詳解 - 木凌的博客 - 博客頻道 - CSDN.NET

雖然代碼解析的是YOLO v1版本的,不過v2版本基本也差不多,最大的改動就是最後一層將detection_layer.c改成了region_layer.c ,具體可參考yolo-9000論文。


那是作者的自留地……

開放給大家來寫cfg文件


推薦閱讀:

能否用具體的例子解釋一下 (Model-based) Structural Estimation?
我註冊了一個全新的 Quora 賬戶,它是怎麼知道我喜歡什麼的?
FTRL演算法在使用中需不需要通過Batch Model初始化?
關於L2範數如何避免過擬合?
中國基層編作曲從業人員是否可能被人工智慧取代?

TAG:機器學習 | 開源 | 圖像識別 | 源碼閱讀 | 深度學習DeepLearning |