我覺得學習caffe,必須得做到會修改源碼,剛開始可以不需要知道所有的函數是如何實現的,但必須得知道里邊都有哪些函數,這些函數都可以幹什麼。
用網上流行的比喻:Blobs,Layers,Nets的關係就好比,Blob是磚塊,Layer是牆,net是一棟大樓。
Blob:
Blob是一個模板類,在內存中表示4維數組,維度從低到高爲:width、height、channels(顏色通道)、num(第幾幀)
函數總結:
- Reshape:變形函數,根據輸入參數重新設置當前Blob形狀
- cpu_data:只讀獲取cpu data的指針
- set_cpu_data:修改cpu data的指針
- gpu_data:只讀獲得gpu data的指針
- cpu_diff:只讀獲得cpu diff的指針
- gpu_diff:只讀獲得gpu diff的指針
- mutable_cpu_data:讀寫訪問cpu data的指針
- mutable_gpu_data:讀寫訪問gpu data的指針
- mutable_cpu_diff:讀寫訪問cpu diff的指針
- mutable_gpu_diff:讀寫訪問gpu diff的指針
- ShareData:共享data指針
- ShareDiff:共享diff指針
- Update:網絡參數Blob的更新
- asum_data:計算data的L1範數
- sumsq_data:計算data的L2範數
- scale_data:對data進行幅度縮放
- CopyFrom:從另一個Blob對象拷貝data
- FromProto:從BlobProto中加載一個Blob
- ToProto:將Blob中的data導出到BlobProto結構體
Layer:
Layer至少有一個輸入Blob和一個輸出Blob,部分Layer帶有權值和偏置項,有兩個運算方向:前向傳播、後向傳播
值得注意的是:大部分函數沒有在Layer.cpp中實現,只有虛函數,真正實現的都在派生類中,具體看各個cpp
函數總結:
- Reshape:變形函數,修改Top Blob以及內部Blob緩衝區的形狀
- Forward:前向傳播函數,給定Bottom Blob,計算Top Blob和Loss,返回值爲當前層loss
- Backward:反向傳播函數,給定Top Blob誤差梯度,就按Bottom Blob誤差梯度
- ToProto:將Layer初始化參數寫入ProtoBuffer緩衝區中
- loss:返回某個Top Blob相關的標量loss值
- CheckBlobCounts:校驗輸入/輸出BLob數目是否滿足Layer要求
- SetLossWeights:該函數在layer中SetUp函數中被調用,主要目的是初始化與Top Blob相關的loss權重,放到Top Blob的diff域中,實際由Forward()計算loss
在layer中的Forward和Backward是前向傳播函數和後向傳播函數包裝,不需要修改這兩個函數,使用的時候只需要在派生類改寫Forward_cpu、Forward_gpu、Backward_cpu、Backward_gpu
Net:
Net在caffe中代表一個完整的CNN模型,它包括若干Layer實例
函數總結:
- ForwardPrefilled:運行前向傳播,輸入Blob已經預先填充
- ForwardFromTo:前向傳播的其中一種形式,還包括其他兩種形式
- Forward:前向傳播,指定輸入Blob進行前向傳播
- ClearParamDiffs:清零所有權值的diff域,應在反向傳播之前運行
- Backward:反向傳播,無需指定輸入/輸出Blob,因爲前向傳播的時候已經建立聯繫
- ForwardBackward:前向傳播+後向傳播,輸入爲Bottom Blob,輸出爲loss
- Update:根據已經(solver)準備好的diff值更新網絡權值
- ToProto:序列化一個Net到ProtoBuffer
- ToHDF5:序列化一個Net到HDF5
- num_inputs:返回輸入Blob數目
- num_output:返回輸出Blob數目
- FilterNet:過濾掉用戶指定的在某個階段、級別、狀態下不應該包含的Layer
- AppendTop:爲網絡追加一個Top Blob
- AppendBottom:爲網絡追加一個Bottom Blob
- AppendParam:爲網絡追加一個權值Blob