Caffe 基本架構
理解caffe的架構,包括blob,layer,net,solver,tools的關係等
源碼文件結構
- tools
- 保存的源碼是用於生成二進制處理程序的,caffe在訓練時實際是直接調用這些二進制文件
- include
- Caffe的實現代碼的頭文件
- src
- 實現Caffe的源文件
- gtest: google test一個用於測試的庫你make runtest時看見的很多綠色RUN OK就是它,這個與caffe的學習無關,不過是個有用的庫
- caffe: 關鍵代碼:
- ./test:用gtest測試caffe的代碼
- ./util:數據轉換時用的代碼
+注:caffe速度快很大程度得益於內存設計上的優化(blob數據結構採用proto)以及對卷積的優化(部分與im2col相關) - ./proto:全稱“Google Protocol Buffer”,是一種數據存儲格式,幫助caffe提速
- ./layers:深度神經網絡中包含的各層網絡相關代碼
- ./solvers:各種優化方法的相關代碼
- blob.cpp:基本的數據結構Blob類
- common.cpp:Caffe類
- data_transformer.cpp:輸入數據的基本操作類DataTransformer
- internal_thread.cpp:使用boost::thread線程庫
- layer_factory.cpp:網絡層Layer類
- net.cpp:網絡結構Net類
- parallel.cpp:多機數據並行
- solver.cpp:優化方法Solver類
- syncedmem.cpp:分配內存和釋放內存類CaffeMallocHost,用於同步GPU,CPU數據
Caffe官方說明的三級結構
http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
blob:數據操作、存儲、交換;
layer:網絡模型集成和計算;
net:整合和連接layer
Blob
- Blob是Caffe的基本數據結構,具有CPU和GPU之間同步的能力。Caffe的數據存儲和數據交流都是通過blobs,並且提供了一個統一的數據存儲的接口。只要是caffe網絡中傳遞的數據都可以用blob存儲:圖片、參數、梯度…
- Blob數據維度:4維的數組(number N×channels K×height H×width W)
- Blob數據存儲:row-major:(n,k,h,w)的存儲物理位置爲((n×K+k)×H+h)×W+w
- Blob同時保存了data和diff,訪問data或diff的兩種方法:
1 const Dtype cpu_data() const; //不修改值
2 Dtype mutable_cpu_data(); //修改值 - 實例:
- 一個“層”,可以理解爲執行相應操作後,得到的結果。比如,執行卷積操作,得到卷積層;執行全連接操作,得到全連接層。對於一個卷積層,其處理的“輸入”是多個feature maps,也就是一個Blob實例:(N1,C1,H1,W1),比如(5,3,224,224),表示5張圖像(這裏的5,可以認爲是一個minibatch的batch size,即圖片數量)
- 卷積操作需要卷積核的參與,卷積核也是Blob的實例:(N2,C2,H2,W2),比如(96,3,7,7),表示有96個卷積核,每個卷積核是一個3維的結構,是7x7的截面、3個通道的卷積核
- 卷積層的輸出也是若干feature maps,也是一個Blob實例:(N3,C3,H3,W3),是根據輸入的feature maps和指定的卷積核計算出來的。按上面的例子,得到feature map的Blob描述爲(5,96,218,218),表示有5個feature maps,每個feature map是96x218x218大小(通常可以這樣理解:卷積核的個數,作爲結果feature maps中的通道數量)
Layer
- 模型的基礎、計算的單元:所有的Pooling,Convolusion,apply nonlinearities, load data,compute losses等操作都在這裏實現
- layer中input data用bottom表示,output data用top表示。每一層定義了三種操作setup(Layer初始化), forward(正向傳導,根據input計算output), backward(反向傳導計算,根據output計算input的梯度)。forward和backward分別有GPU和CPU兩個版本的實現
Net
- Net由一系列的Layer組成,Layer之間的連接由一個文本文件描述。
- Net中既包括Blob對象又包括Layer對象:Blob存儲每個Layer輸入和輸出中間結果,Layer根據Net描述對指定的輸入Blob進行計算處理
- 模型初始化Net::Init()會創建blobs和layers搭建整個網絡,並調用Layer::SetUp。在此過程中Net會報告初始化進程。在初始化之後通過Caffe::set_mode()設置Caffe::mode()來選擇運行平臺CPU或GPU
其他
- –>solver.prototxt文件被Caffe讀取後,最終會被Caffe解析成一個叫SolverParameter的數據對象
–>solver.prototxt中定義的net文件train.prototxt也會被Caffe解析成一個叫NetParameter的數據對象
–>NetParameter中layer的類型LayerParameter,layer被解析成一個LayerParameter的數據對象。以上在caffe.proto中找到Solver/Net/LayerParameter,就可以知道Solver/Net/LayerParameter的所有字段及含義描述
參考
http://www.cnblogs.com/zjutzz/p/5960289.html
http://yufeigan.github.io/
http://blog.csdn.net/savant_ning/article/details/53013627