Caffe程式碼結構

查志強發表於2015-08-07

【原文:https://yufeigan.github.io/2014/12/09/Caffe%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B01-%E5%AE%89%E8%A3%85%E4%BB%A5%E5%8F%8A%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%84/

目錄結構

caffe資料夾下主要檔案: 這表示資料夾

  • data 用於存放下載的訓練資料
  • docs 幫助文件
  • example 一些程式碼樣例
  • matlab MATLAB介面檔案
  • python Python介面檔案
  • model 一些配置好的模型引數
  • scripts 一些文件和資料用到的指令碼

下面是核心程式碼資料夾:

  • tools 儲存的原始碼是用於生成二進位制處理程式的,caffe在訓練時實際是直接呼叫這些二進位制檔案。
  • include Caffe的實現程式碼的標頭檔案
  • src 實現Caffe的原始檔

後面的學習主要圍繞後面兩個檔案目錄(includesrc)下的程式碼展開

原始碼結構

由於includesrc兩個目錄在層次上基本一一對應因此主要分析src即可瞭解檔案結構。

這裡順便提到一個有意思的東西,我是在Sublime上面利用SublimeClang外掛分析程式碼的(順便推薦下這外掛,值得花點時間裝)。在配置的時候發現會有錯誤提示找不到”caffe/proto/caffe.pb.h”,去看了下果然沒有,但編譯的時候沒有報錯,說明是生成過後又刪除了,檢視Makefile檔案後發現這裡用了proto編譯的,所以在”src/caffe/proto”下面用CMakeLists檔案就可以編譯出來了。

  • src
    • gtest google test一個用於測試的庫你make runtest時看見的很多綠色RUN OK就是它,這個與caffe的學習無關,不過是個有用的庫
    • caffe 關鍵的程式碼都在這裡了
      • test 用gtest測試caffe的程式碼
      • util 資料轉換時用的一些程式碼。caffe速度快,很大程度得益於記憶體設計上的優化(blob資料結構採用proto)和對卷積的優化(部分與im2col相關)[1]。
      • proto 即所謂的“Protobuf”[2],全稱“Google Protocol Buffer”,是一種資料儲存格式,幫助caffe提速。
      • layers 深度神經網路中的基本結構就是一層層互不相同的網路了,這個資料夾下的原始檔以及目前位置“src/caffe”中包含的我還沒有提到的所有.cpp檔案就是caffe的核心目錄下的核心程式碼了。

原始碼主要關係

如上所言我們現在可以知道,caffe核心中的核心是下面的文件和檔案:(這部分目前不清楚的地方先參照別人的觀點)

  • blob[.cpp .h] 基本的資料結構Blob類[3]。
  • common[.cpp .h] 定義Caffe類
  • internal_thread[.cpp .h] 使用boost::thread執行緒庫
  • net[.cpp .h] 網路結構類Net
  • solver[.cpp .h] 優化方法類Solver
  • data_transformer[.cpp .h] 輸入資料的基本操作類DataTransformer
  • syncedmem[.cpp .h] 分配記憶體和釋放記憶體類CaffeMallocHost,用於同步GPU,CPU資料
  • layer_factory.cpp layer.h 層類Layer
  • layers 此資料夾下面的程式碼全部至少繼承了類Layer

Caffe的官方說明

根據Caffe官方文件介紹,caffe大致可以分為三層結構blob,layer,net。資料的儲存,交換以及操作都是以blob的形式進行的,layer是模型和計算的基礎,net整和並連線layer。solver則是模型的優化求解。

[1]: linger: 我所寫的CNN框架 VS caffe
[2]: Google Protocol Buffer 的使用和原理
[3]: caffe原始碼簡單解析——Blob(1)


相關文章