Caffe的框架

文章作者:Tyan
博客:noahsnail.com ?|? CSDN ?|? 簡書

Caffe的設計

根據賈揚清的分享整理

Caffe遵循了神經網絡的一個假設:所有的計算都是以layer形式表示的,layer的作用就是根據輸入數據,輸出一些計算以后的結果。以卷積為例,就是輸入一幅圖像,然后與這一層的參數(filter)進行卷積運算,然后輸出卷積的結果。每一個layer需要進行兩種運算:1.forward,從輸入計算輸出;2.backward根據上面的梯度(gradient)來計算相對于輸入的梯度。在每個layer都實現了這兩個函數以后,我們可以將很多層連接成一個網絡,這個網絡做的事情就是輸入我們的數據(圖像或者語音或者whatever),然后來計算我們需要的輸出(比如說識別的label)。在訓練時,我們可以根據已有的label來計算loss和gradient,然后用gradient來update網絡的參數。這個就是Caffe的一個基本流程!

Caffe主要結構

Caffe代碼本身非常模塊化,主要由4部分組成Blob,Layer,Net和Solver。

  • Blob

Blob主要用來表示網絡中的數據,包括訓練數據,網絡各層自身的參數,網絡之間傳遞的數據都是通過Blob來實現的,同時Blob數據也支持在CPU與GPU上存儲,能夠在兩者之間做同步。

  • Layer

Layer是對神經網絡中各種層的一個抽象,包括卷積層和下采樣層,還有全連接層和各種激活函數層等等。同時每種Layer都實現了前向傳播和反向傳播,并通過Blob來傳遞數據。

  • Net

Net是對整個神經網絡的表示,由各種Layer前后連接組合而成,也是我們要構建的網絡模型。

  • Solver

Solver定義了針對Net網絡模型的求解方法,記錄神經網絡的訓練過程,保存神經網絡模型參數,中斷并恢復網絡的訓練過程。自定義Solver能夠實現不同的神經網絡求解方式。

Caffe整體架構

Caffe的架構與其它的深度學習框架稍微不同,它沒有根據算法實現過程的方式來進行編碼,而是以系統級的抽象作為整體架構,逐層的封裝實現細節,使得上層的架構變得很清晰。Caffe的整體架構如下:

1. SyncedMem

這個類的主要功能是封裝CPU和GPU的數據交互操作。一般來說,數據的流動形式都是:硬盤->CPU內存->GPU內存->CPU內存->(硬盤),所以在寫代碼的過程中經常會寫CPU/GPU之間數據傳輸的代碼,同時還要維護CPU和GPU兩個處理端的內存指針。這些事情處理起來不會很難,但是會很繁瑣。因此SyncedMem的出現就是把CPU/GPU的數據傳輸操作封裝起來,只需要調用簡單的接口就可以獲得兩個處理端同步后的數據。

2. Blob

Blob是用于存儲數據的對象,在Caffe中各種數據(圖像輸入、模型參數)都是以Blob的形式在網絡中傳輸的,Blob提供統一的存儲操作接口,可用來保存訓練數據、模型參數等,同時Blob還能在CPU和GPU之間進行同步以支持CPU/GPU的混合運算。
這個類做了兩個封裝:一個是操作數據的封裝,使用Blob可以操縱高維的數據,快速訪問其中的數據,變換數據的維度等;另一個是對原始數據和更新量的封裝,每一個Blob中都有data和diff兩個數據指針,data用于存儲原始數據,diff用于存儲反向傳播(Backpropagation)的梯度更新值。Blob使用了SyncedMem,這樣便于訪問不同的處理端。Blob基本實現了整個Caffe數據結構部分的封裝,在Net類中可以看到所有的前后向數據和參數都用Blob來表示就足夠了。數據的抽象到這個就可以了,接下來作層級的抽象。神經網絡的前后向計算可以做到層與層之間完全獨立,只要每個層按照一定的接口規則實現,就可以確保整個網絡的正確性。

3. Layer

Layer是網絡Net的基本單元,也是Caffe中能在外部進行調整的最小網絡結構單元,每個Layer都有輸入Blob和輸出Blob。Layer(層)是Caffe中最龐大最繁雜的模塊,它是神經網絡的基本計算單元。由于Caffe強調模塊化設計,因此只允許每個layer完成一類特定的計算,例如convolution操作、pooling、非線性變換、內積運算,以及數據加載、歸一化和損失計算等。Caffe中layer的種類有很多,具體的種類及功能請看官方文檔。在創建一個Caffe模型的時候,也是以Layer為基礎進行的。Layer是一個父類,它的下面還有各種實現特定功能的子類,例如data_layer,conv_layer,loss_layer等。Layer是通過LayFactory來創建的。

4. Net

Net是一個完整的深度網絡,包含輸入層、隱藏層、輸出層,在Caffe中一般是一個卷積神經網絡(Convolution Neural Networ,CNN)。通過定義不同類型的Layer,并用Blob將不同的Layer連接起來,就能產生一個Net。Net將數據Blob和層Layer組合起來做進一步的封裝,對外提供了初始化和前后傳播的接口,使得整體看上去和一個層的功能類似,但內部的組合可以是多種多樣的。值得一提的是,每一層的輸入輸出數據統一保存在Net中,同時每個層內的參數指針也保存在Net中,不同的層可以通過WeightShare共享相同的參數,因此可以通過配置來實現多個神經網絡層之間共享參數的功能。一個Net由多個Layer組成。一個典型的網絡從data layer(從磁盤中載入數據)出發到loss layer結束。

5. Solver

有了Net就可以進行神經網絡的前后向傳播計算了,但是還缺少神經網絡的訓練和預測功能,Solver類進一步封裝了訓練和預測相關的一些功能。它還提供了兩個接口:一個是更新參數的接口,繼承Solver可以實現不同的參數更新方法,如Momentum,Nesterov,Adagrad等,因此可以使用不同的優化算法。另一個接口是訓練過程中每一輪特定狀態下的可注入的一些回調函數,在代碼中這個回調點的直接使用者就是多GPU訓練算法。Solver定義了針對Net網絡模型的求解方法,記錄網絡的訓練過程,保存網絡模型參數,中斷并恢復網絡的訓練過程。自定義Solver能夠實現不同的神經網絡求解方式。閱讀Solver的代碼可以了解網絡的求解優化過程。Solver是一個父類,它下面還有實現不同優化方法的子類,例如sgd_solver,adagrad_sovler等,Solver是通過SolverFactory來創建的。

6. Proto

caffe.proto位于…/src/caffe/proto目錄下,在這個文件夾下還有一個.pb.cc和一個.pb.h文件,這兩個文件都是由caffe.proto編譯而來的。 在caffe.proto中定義了很多結構化數據,包括:
BlobProto、Datum、FillerParameter、NetParameter、SolverParameter、SolverState、LayerParameter、ConcatParameter、ConvolutionParameter、DataParameter、DropoutParameter、HDF5DataParameter、HDF5OutputParameter、ImageDataParameter、InfogainLossParameter、InnerProductParameter、LRNParameter、MemoryDataParameter、PoolingParameter、PowerParameter、WindowDataParameter、V0LayerParameter。

7. IO

除了上面的東西之外,還需要輸入數據和參數。DataReader和DataTransformer幫助準備輸入數據,Filler對參數進行初始化,一些Snapshot方法可以對模型進行持久化。

參考資料:

  1. https://zhuanlan.zhihu.com/p/21796890
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,501評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,673評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,610評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,939評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,668評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,004評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,001評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,173評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,705評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,426評論 3 359
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,656評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,139評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,833評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,247評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,580評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,371評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,621評論 2 380

推薦閱讀更多精彩內容