1. 程式人生 > >caffe程式碼梳理

caffe程式碼梳理

caffe目錄結構

命令:tree -d
build ->.build_release //編譯結果存放處,子目錄結構與主目錄類似
cmake //使用CMake編譯時會用到,不關注
data //用與存放原始資料和資料獲取指令碼
distribute //編譯後生成釋出包的位置,用於遷移
docker //同樣是為了便於遷移,使用了Docker工具
docs //doxygen工程檔案放在這裡,可生成caffe ref_man.pdf
examples //存放Caffe簡單例程
include //Caffe標頭檔案集中存放與這個目錄
matlab //適用於Matlab做Wrapper,具體可以參考RCNN原始碼
models //存放示例模型
python //用python Wrapper
scripts //存放指令碼
src //Caffe原始碼
tools //常用工具原始碼
extra
關注三個子目錄:include/、src/、tools/

如何有效閱讀Caffe原始碼

1.從src/caffe/proto/caffe.proto開始
2.看標頭檔案。通過標頭檔案類宣告理解整個框架
3.有針對的看cpp和cu檔案
4.編寫各類工具,整合到Caffe內部,

注:命令:grep -n -H -R “REGISTER_LAYER_CREATOR”
-n -顯示行號,便於定位
-H -顯示檔名,便於定位
-R -遞迴查詢每個子目錄,適合工程較大,分多個目錄存放的場景

Caffe支援哪些深度學習特性

這裡寫圖片描述
輸入層為二維影象資料,前幾層都是卷積層,用於提取低維到高維特徵,最後兩層為全連線層,類似於多層感知器,用於對前面提供的特徵進行分類,卷積層和全連線層統稱為權值層。

卷積層
卷積運算:
這裡寫圖片描述
維度可以升為三維四維,公式重新表達為:
這裡寫圖片描述
L個輸出通道;K個輸入通道;需要LK個卷積核實現通道數目的轉換
卷積核大小為IJ;輸出通道的特徵圖大小為MN,
該層每個樣本做一次前向傳播時卷積層計算量為:
這裡寫圖片描述
從examples/mnist/lenet_val.prototxt中找到卷積引數描述:
num_output:50 //對應公式中的L
kernel_size:5 //對應公式中的I和J
KMN從日誌檔案中找
Top shape:64 20 12 12 (184320)
Setting up conv2
Top shape:64 50 8 8(204800)
M=N=8
K=20
Calculations(MAC)=55

885020=1600000MAC
學習引數數量:Param=I
JKL=25000
計算量-引數比:CPR=Calculations/Params=MN=64

結論:卷積層的輸出特徵圖尺寸越大,CPR值越大,引數重複利用率越高。若輸入一批資料(B個樣本)則CPR值可再提高B倍

全連線層
每個節點與相鄰層的所有節點都有連線關係
這裡寫圖片描述

計算型別:矩陣-向量乘(GEMV)y=Wx                        
x:輸入節點組成的向量;D維度;y輸出節點組成的向量;V維度;W為VD權值矩陣    
找到全連線引數描述
examples/mnist/lenet_train_val.prototxt                      
inner_product_param//全連線層引數
num_output:500 //該層輸出元素個數為500對應公式中的V
執行日誌:Top shape:64 50 4 4   D = 5044=800               
全連線層單樣本前向傳播計算量統計為:CalculationsMAC = VD = 800500=400000
引數量統計為:Params = V*D=400000
CPR值= Calculations/Params = 1 
全連線層的CPR值始終為1,與輸入輸出維度無關

啟用函式
非線性處理單元                             
這裡寫圖片描述                           
這裡寫圖片描述

這裡寫圖片描述                
啟用函式相關的Layer類宣告都位於include/caffe/neural_layers.hpp中              
主要關注ReLULayer、SigmoidLayer和TanHLayer類

參考:深度學習21天實戰Caffe。作者:趙永科