[caffe解读] caffe从数学公式到代码实现1-导论
新板塊說明
今天開一個新板塊,目標是死磕現有的幾大機器學習框架的代碼,給想入門的小白們一些幫助。
作為一個在圖像行業戰斗了幾年的程序員,深知入門一個框架,和真的能用好一個框架是有很大的區別的,而要想走的更遠,開源框架的底層代碼一定要去詳讀。
同時,很多的坑也是在代碼中,不仔細讀是不知道的。所以,我會單開子菜單,來跟大家系統細致地學習一些主流的機器學習框架。
今天這個是caffe,大概會有7篇左右的文章,一般讀caffe代碼思路是按照caffe的層級結構來,blob到layer到net各自分層來讀,但我想提供一個另外的思路,從數學公式到代碼實現。
從每一個文件背后具體的數學含義來讀,這對于我們非數學系或者數學基礎不是很好的工程人員來說,是比較適合的。
采取的形式就是,layer definition,caffe layer,caffe test layer的格式,舉個例子來說,比如softmax,那我就打算從softmax的數學定義,caffe softmax層的實現,caffe softmax test layer的實現。重要代碼要加上test layer,因為當我們自己實現某些類時,往往需要梯度反向求導,這時候最好自己寫test來驗證自己的代碼是否正確。
好了,下面就開始吧。當然,現在這是第一篇,所以我們還是不可避免先打下基礎,先要閱讀下面的內容,對caffe的代碼有基本的了解。這是include/caffe根目錄下面的代碼list。
blob.hpp
一個一個來。
01
1 blob.hpp&cpp
blob是caffe中的基礎數據單元,一個blob是一個四維張量,(N,C,H,W),N是batch size大小,C是channel,H,W分別是圖像寬高,由于caffe擅長于做圖像,所以這個定義天然適合圖像。故一個256*256的rgb圖像,blob size是(1,3,256,256)。
blob.hpp,需要注意的就是下面的變量和函數
其中data_存儲數據,diff_存儲梯度,shape_分別是blob_的尺度,count_是所有數據數目,即N*C*H*W。
以后要訪問這些數據,就會用到下面的函數,其中cpu_data是只讀,mutable_cpu_data是可寫,gpu類似。
上面還有一個疑問,那就是初次見到SyncedMemory類會不知道它是做什么的,它主要負責在GPU或者CPU上分配內存以及保持數據的同步作用。
可參考下面資料:
http://blog.csdn.net/xizero00/article/details/51001206
http://www.cnblogs.com/korbin/p/5606770.html
由于展開是另一個篇幅,因此我們不過多停留在此,知道blob是通過這樣的方式存取即可。
02
caffe.hpp&cpp等
把這幾個放這里,一是這里很多是關于gpu和內存等較為底層的編程的,看起來比較費勁,一般也不需要去修改,大家會用即可。重點會講一下factory。
caffe.hpp頭文件包含其他基礎hpp。
internal_thread.hpp,與線程有關的變量函數。
parallel.hpp,與并行有關的變量函數。
syncedmem.hpp,內存分配和Caffe的底層數據的切換
solver_factory.hpp,layer_factory.hpp,顧名思義,分別是caffe solver的工廠類模板定義和普通layer的模板定義。
舉例拿sovler來多說幾句,solver_factory.hpp,其中solver指的是優化方法,由于caffe優化采用的就是梯度下降的方法,包括SGD,NesterovSolver,RMSPropSolver,AdamSolver等通通都定義在sgd_solvers.hpp中。
工廠設計模型,簡單了解如下
http://developer.51cto.com/art/201107/277728.htm
http://alanse7en.github.io/caffedai-ma-jie-xi-4/
深入了解需要自己去看,從代碼的角度來看就是解決重復造輪子的問題,減少重復代碼,在caffe的面試中經常會問到噢。
看下它的代碼,重要變量兩個
typedef Solver<Dtype>* (*Creator)(const
typedef std::map<string, Creator>
重要函數兩個,
static CreatorRegistry& Registry() { static CreatorRegistry*
其中需要注意的是,SolverParameter是一個配置參數不說,CreatorRegistry就是我們以后自定義層需要知道的,需要知道registry是一個map,存儲的就是字符串以及對應的以函數指針形式存儲的Creator類型的函數,而注冊都會在cpp中進行,以后詳解。
common.hpp,是一些與io有關的函數與變量,cpu與gpu模式設定變量Brew mode_;函數set_mode,setDevice,以及與隨機數有關的函數變量shared_ptr<RNG> random_generator_;
03
?datatransform.hpp&cpp
這是很重要的一個文件,當我們自定義數據層的時候會用到,它的作用就是從磁盤中讀取數據塞進caffe定義的變量內存中。從它的頭文件就可以看出,它依賴于blob,common,以及caffe.pb.h
#include "caffe/blob.hpp"
caffe.pb.h中就包含了需要序列化的變量。
datatransform.hpp中的變量如下:
shared_ptr<Caffe::RNG> rng_;
可見存儲了常見的mean_value。
datatransform.hpp中的的核心是重載的transform函數,它可以按照不同的輸入來載入數據,我們平常在caffe內部做的隨機crop,flip等等操作都在這里完成,具體大家可以去研究源碼,靜下心看非常簡單。
void Transform(const vector<Datum> & datum_vector,Blob<Dtype>* transformed_blob);
04
filler.hpp
它沒有對應的cpp,所有實現都在hpp中,因為很簡單,它就是對權重初始化的,其中包含,constantfiller,Gaussianfiller,XavierFiller,MSRAFiller等等,相信大家都比較熟了。
05
solver.hpp
這就是caffe 迭代求解優化的函數定義,其中重要變量loss就在這里,這就是訓練caffe時顯示出的loss的來源
vector<Dtype> losses_;
迭代優化的函數,
virtual void Solve(const char* resume_file = NULL);
06
layer.hpp
這就是一個層的定義了,想必大家很有興趣,那具體都有什么呢?
我們首先看變量,
LayerParameter layer_param_;
然后看重要函數
LayerSetUp,用于layer初始化,一般是定義一些shape,初始化一些變量。
virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>&
Forward,Backward的cpu和gpu版本,除了數據層等少量層外始終成對存在的前向和反向函數,forward是基于bottom計算top,backward則是基于top計算bottom,很好理解。
virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom, const vector<Blob<Dtype>*>& top) = 0;
07
net.hpp
這是最大的一個hpp了,也是最高層的,就是整個網絡的定義。
看看重要變量:
vector<shared_ptr<Layer<Dtype> > > layers_;
layers_就是所有層,layer_names_;存儲了名字,以后在我們inference的時候會需要經常用到。
vector<float> params_lr_;
上面是每一層學習率的參數,在我們想要固定某些層不讓其學習,或者調整不同層的學習率時,會非常重要。其實還有很多重要變量如,
vector<Dtype> blob_loss_weights_;
都是經常接觸的,不一一描述了大家自己看代碼。
下面是一個重載的重要函數,
void CopyTrainedLayersFrom(const
它是重要的初始化網絡的方法,可以實現不同形式輸入的初始化,在inference時會經常使用的。
好了,第一次基礎就這么多,并沒有非常細致的講述而只是對重要內容進行介紹,在開始下面的文章之前,一定要熟讀上面的這些hpp和對應cpp文件,對它有什么是什么,熟練于胸。
同時,在我的知乎專欄也會開始同步更新這個模塊,歡迎來交流
https://zhuanlan.zhihu.com/c_151876233
注:部分圖片來自網絡
—END—
打一個小廣告,我的攝影中的圖像基礎技術公開課程《AI 程序員碼說攝影圖像基礎》上線了,主要從一個圖像處理工程師的角度來說說攝影中的基礎技術和概念,歡迎大家訂閱交流。
加入我們做點趣事
微信
Longlongtogo
公眾號內容
1 心路分享|2 攝影知識|3 深度學習
往期精彩
?
如何步入深度學習刷榜第一重境界。
?
為了壓榨CNN模型,這幾年大家都干了什么。
2016自動駕駛外行裝逼攻略(超長文推薦)。
一文說說這十多年來計算機玩攝影的歷史。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的[caffe解读] caffe从数学公式到代码实现1-导论的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何步入深度学习刷榜第一重境界
- 下一篇: [caffe解读] caffe从数学公式