1. 程式人生 > >【caffe原始碼的梳理之零】caffe框架整體介紹

【caffe原始碼的梳理之零】caffe框架整體介紹

caffe作為深度學習框架,由C++語言開發,中間使用了大量的類的封裝、繼承、多型,在學習caffe的同時也是在對C++語言特性的學習,可謂一舉兩得。廢話不多說,直接上程式碼吧。

1、caffe原始碼的目錄結構

$ tree -d
.
├── cmake                               //cmake編譯時會用到<非後續重點學習>
│   ├── External
│   ├── Modules
│   └── Templates
├── data                                //存放原始資料或資料獲取方式的指令碼檔案
│ ├── cifar10 //cifar10資料集 │ ├── ilsvrc12 //ImageNet資料集 │ └── mnist //mnist手寫數字資料 ├── docker //Docker工具便於遷移<非後續重點學習> │ ├── cpu │ └── gpu ├── docs //doxygen工程檔案放在這裡<非後續重點學習>
│ ├── _layouts │ ├── images │ ├── stylesheets │ └── tutorial │ ├── fig │ └── layers ├── examples //caffe的簡單例程 │ ├── cifar10 │ ├── cpp_classification │ ├── feature_extraction │ ├── finetune_flickr_style │ ├── finetune_pascal_detection │ ├── hdf5_classification │ ├── imagenet │ ├── images │ ├── mnist │ ├── net_surgery │ ├── pycaffe │ │ └── layers │ ├── siamese │ └── web_demo │ └── templates ├── include
//caffe的標頭檔案主要放在此目錄下<後續學習的重點> │ └── caffe │ ├── layers │ ├── test │ └── util ├── matlab //caffe的Matlab介面 │ ├── +caffe │ │ ├── +test │ │ ├── imagenet │ │ └── private │ ├── demo │ └── hdf5creation ├── models //存放示例模型 │ ├── bvlc_alexnet │ ├── bvlc_googlenet │ ├── bvlc_reference_caffenet │ ├── bvlc_reference_rcnn_ilsvrc13 │ └── finetune_flickr_style ├── python //caffe的python介面 │ └── caffe │ ├── imagenet │ └── test ├── scripts //存放指令碼 │ └── travis ├── src //caffe的原始碼<後續學習的重點> │ ├── caffe │ │ ├── layers │ │ ├── proto │ │ ├── solvers │ │ ├── test │ │ │ └── test_data │ │ └── util │ └── gtest └── tools //常用工具的原始碼<後續學習的重點> └── extra 69 directories

由於是對深度學習框架原始碼的梳理,所以這裡我們主要關注:include/、src/和tool/這三個子目錄以及其對應的程式碼。

2、程式碼的閱讀順序

第一步、src/caffe/proto/caffe.proto檔案
  這個檔案主要是基本的資料結構記憶體物件與磁碟檔案的一一對應關係。
第二步、標頭檔案
  標頭檔案中涉及多個類的宣告,這裡我們從最底層最基礎的看起,依次抽象,直到整個框架。即:Blob -> Layers -> Nets
第三步、針對性的cpp檔案和cu檔案
  對標頭檔案對宣告的類有一個整體的感知,然後針對具體的類中的重點函式的實現通過這部分的工作做到心中有數,也是神經網路演算法的精髓所在。
  為了部落格的可讀性考慮,這裡會將對應的資料結構的.proto中的對映以及標頭檔案中的宣告以及.cpp檔案中的實現放與同一部落格下,方便查閱和後續的理解。

3、實踐應用

  根據具體的實驗對框架進行一定程度的修改。如網路模型的壓縮可能要對Blob中基本資料與磁碟檔案資料的對映關係作出改變等、神經網路的優化根據具體優化的措施可能對layers和solvers中的部分作出修改等。