1. 程式人生 > >Darknet 原始碼學習和非常詳細的中文註釋(絕對經典)

Darknet 原始碼學習和非常詳細的中文註釋(絕對經典)

https://pjreddie.com/darknet/

用於人臉表情端到端系統的重訓練

附錄1:

darknet深度學習框架原始碼分析:詳細中文註釋,涵蓋框架原理與實現語法分析

https://github.com/hgpvision/darknet

darknet是一個較為輕型的完全基於C與CUDA的開源深度學習框架,其主要特點就是容易安裝,沒有任何依賴項(OpenCV都可以不用),移植性非常好,支援CPU與GPU兩種計算方式

相比於TensorFlow來說,darknet並沒有那麼強大,但這也成了darknet的優勢:

  1. darknet完全由C語言實現,沒有任何依賴項,當然可以使用OpenCV,但只是用其來顯示圖片、為了更好的視覺化;

  2. darknet支援CPU(所以沒有GPU也不用緊的)與GPU(CUDA/cuDNN,使用GPU當然更塊更好了);

  3. 正是因為其較為輕型,沒有像TensorFlow那般強大的API,所以給我的感覺就是有另一種味道的靈活性,適合用來研究底層,可以更為方便的從底層對其進行改進與擴充套件;

  4. darknet的實現與caffe的實現存在相似的地方,熟悉了darknet,相信對上手caffe有幫助;

附錄2:

作者:知乎使用者
連結:https://www.zhihu.com/question/51747665/answer/145607615
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。
 

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這裡有改正。