Caffe代碼導(dǎo)讀(2):caffe結(jié)構(gòu)分析

caffe目錄結(jié)構(gòu)

  • docs —— 幫助文檔
  • examples —— 代碼樣例
  • matlab —— MATLAB接口文件
  • python —— PYTHON接口文件
  • models —— 一些配置好的模型參數(shù)
  • scripts —— 一些文檔和數(shù)據(jù)會用到的腳本
  • 核心代碼:
    • tools —— 保存的源碼是用于生成二進制處理程序的封恰,caffe在訓(xùn)練時實際是直接調(diào)用這些二進制文件
    • include —— Caffe的實現(xiàn)代碼的頭文件
    • src —— 實現(xiàn)Caffe的源文
    • gtest —— google test一個用于測試的庫. 你make runtest時看見的很多綠色RUN OK就是它游沿,這個與caffe的學(xué)習(xí)無關(guān)尸折,不過是個有用的庫
    • caffe —— 關(guān)鍵代碼:
      • test —— 用gtest測試caffe的代碼
      • util —— 數(shù)據(jù)轉(zhuǎn)換時用的一些代碼浅缸。caffe速度快换薄,很大程度得益于內(nèi)存設(shè)計上的優(yōu)化(blob數(shù)據(jù)結(jié)構(gòu)采用proto)和對卷積的優(yōu)化(部分與im2col相關(guān))
      • proto —— 即所謂的“Protobuf”早歇,全稱“Google Protocol Buffer”多柑,是一種數(shù)據(jù)存儲格式遥椿,幫助caffe提速
      • layers —— 深度神經(jīng)網(wǎng)絡(luò)中的基本結(jié)構(gòu)就是一層層互不相同的網(wǎng)絡(luò)了堰燎,這個文件夾下的源文件以及目前位置“src/caffe”中包含所有.cpp文件就是caffe的核心目錄下的核心代碼了掏父。
  • caffe最核心的代碼:
    • blob[.cpp .h] —— 基本的數(shù)據(jù)結(jié)構(gòu)Blob類
    • common[.cpp .h] —— 定義Caffe類
    • internal_thread[.cpp .h]—— 使用boost::thread線程庫
    • net[.cpp .h] —— 網(wǎng)絡(luò)結(jié)構(gòu)類Net
    • solver[.cpp .h] —— 優(yōu)化方法類Solver
    • data_transformer[.cpp .h] —— 輸入數(shù)據(jù)的基本操作類DataTransformer
    • syncedmem[.cpp .h] —— 分配內(nèi)存和釋放內(nèi)存類CaffeMallocHost,用于同步GPU秆剪,CPU數(shù)據(jù)
    • layer[.cpp .h] —— 層類Layer
    • layers ——  此文件夾下面的代碼全部至少繼承了類Layer, 從layer_factory中注冊繼承

caffe的三級機構(gòu)(Blobs,Layers,Nets)

  • Blobs,Layers,Nets關(guān)系概述:Caff的net比作一棟大樓赊淑,Layer是構(gòu)成大樓的墻,Blob是構(gòu)成墻的磚塊

  • 功能概括:

    • Blob:用于數(shù)據(jù)的保存仅讽、交換和操作陶缺,Caffe基礎(chǔ)存儲結(jié)構(gòu)
    • Layer:用于模型和計算的基礎(chǔ)
    • Net:整合連接layers
  • 具體介紹:

    • Blob:是caffe中處理和傳遞實際數(shù)據(jù)的數(shù)據(jù)封裝包。是按C風(fēng)格連續(xù)儲存的N維數(shù)組洁灵。
      • 常規(guī)的維度為圖像數(shù)量N通道數(shù)C圖像高度H*圖像寬度W饱岸。

      • 主要變量:

        • shared_ptr data_;
        • shared_ptr diff_;
        • shared_ptr shape_data_;
        • vector shape_;
        • int count_;
        • int capacity_;
      • 解釋:

        • shared_ptr——是一個數(shù)據(jù)boost庫中的智能指針,主要用來申請內(nèi)存
        • data_主要是正向傳播時候用的徽千,diff_主要是用來儲存偏差(主要是反向傳播的時候會用到)苫费,
        • shape_data和shape_——都是存儲Blob的形狀
        • count——表示Blob存儲的元素個數(shù),也就是個數(shù)*通道數(shù)*高度*寬度
        • capacity_——表示當(dāng)前Blob的元素個數(shù)(控制動態(tài)分配)
      • 主要函數(shù):

        • 構(gòu)造函數(shù):構(gòu)造函數(shù)開辟一個內(nèi)存空間來存儲數(shù)據(jù)
        • reshape函數(shù):Reshape函數(shù)在Layer中的reshape或者forward操作中來adjust dimension
        • count函數(shù):重載很多個count()函數(shù)罐栈,主要還是為了統(tǒng)計Blob的容量(volume)黍衙,或者是某一片(slice),從某個axis到具體某個axis的shape乘積(如 “ inline int count(int start_axis, int end_axis)”)荠诬。
        • data_數(shù)據(jù)操作函數(shù) & 反向傳播導(dǎo)數(shù)diff_操作函數(shù):這一部分函數(shù)主要通過給定的位置訪問數(shù)據(jù)琅翻,根據(jù)位置計算與數(shù)據(jù)起始的偏差offset,在通過cpu_data*指針獲得地址
        • FromProto/ToProto數(shù)據(jù)序列化:將數(shù)據(jù)序列化柑贞,存儲到BlobProto方椎,這里說到Proto是谷歌的一個數(shù)據(jù)序列化的存儲格式,可以實現(xiàn)語言钧嘶、平臺無關(guān)棠众、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式。
        • Update函數(shù):該函數(shù)用于參數(shù)blob的更新(weight,bias 等減去對應(yīng)的導(dǎo)數(shù))
        • 其他運算函數(shù):
          • Dtype asum_data() const;//計算data的L1范數(shù)(所有元素絕對值之和)
          • Dtype asum_diff() const;//計算diff的L1范數(shù)
          • Dtype sumsq_data() const;//計算data的L2范數(shù)(所有元素平方和)
          • Dtype sumsq_diff() const;//計算diff的L2范數(shù)
          • void scale_data(Dtype scale_factor);//將data部分乘以一個因子
          • void scale_diff(Dtype scale_factor);//將diff部分乘一個因子
    • layer:
      • 簡介:
        所有的Pooling(池化)闸拿,Convolve(卷積)空盼,apply nonlinearities等操作都在這里實現(xiàn)。在Layer中input data用bottom,表示output data用top表示新荤。每一層定義了三種操作setup(Layer初始化), forward(正向傳導(dǎo)揽趾,根據(jù)input計算output), backward(反向傳導(dǎo)計算,根據(jù)output計算input的梯度)苛骨。forward和backward有GPU和CPU兩個版本的實現(xiàn)篱瞎。

      • caffe中已經(jīng)衍生了很多不同功能作用的layer, 其中常用的五種layer:

        • data_layer(數(shù)據(jù)層)
          • data_layer主要包含與數(shù)據(jù)有關(guān)的文件。在官方文檔中指出data是caffe數(shù)據(jù)的入口是網(wǎng)絡(luò)的最低層痒芝,并且支持多種格式俐筋,在這之中又有5種LayerType:

            • DATA 用于LevelDB或LMDB數(shù)據(jù)格式的輸入的類型,輸入?yún)?shù)有source, batch_size, (rand_skip), (backend)严衬。后兩個是可選澄者。
            • EMORY_DATA 這種類型可以直接從內(nèi)存讀取數(shù)據(jù)使用時需要調(diào)用MemoryDataLayer::Reset,輸入?yún)?shù)有batch_size, channels, height, width请琳。
            • DF5_DATA HDF5數(shù)據(jù)格式輸入的類型闷哆,輸入?yún)?shù)有source, batch_size。
            • HDF5_OUTPUT HDF5數(shù)據(jù)格式輸出的類型单起,輸入?yún)?shù)有file_name抱怔。
            • IMAGE_DATA 圖像格式數(shù)據(jù)輸入的類型,輸入?yún)?shù)有source, batch_size, (rand_skip), (shuffle), (new_height), (new_width)嘀倒。
          • 其實還有兩種WINDOW_DATA, DUMMY_DATA用于測試和預(yù)留的接口,不重要屈留。

        • neuron_layer(數(shù)據(jù)的操作層)
          neuron_layer實現(xiàn)里大量激活函數(shù),主要是元素級別的操作测蘑,具有相同的bottom,top size灌危。
        • loss_layer(損失層/計算網(wǎng)絡(luò)誤差層)

        可以看見調(diào)用了neuron_layers.hpp,估計是需要調(diào)用里面的函數(shù)計算Loss碳胳,一般來說Loss放在最后一層勇蝙。caffe實現(xiàn)了大量loss function,它們的父類都是LossLayer挨约。

        • common_layer

          • 這一層主要進行的是vision_layer的連接
          • 聲明了9個類型的common_layer味混,部分有GPU實現(xiàn):
            • InnerProductLayer 常常用來作為全連接層
            • SplitLayer 用于一輸入對多輸出的場合(對blob)
            • FlattenLayer 將n * c * h * w變成向量的格式n * ( c * h * w ) * 1 * 1
            • ConcatLayer 用于多輸入一輸出的場合
            • SilenceLayer 用于一輸入對多輸出的場合(對layer)
            • (Elementwise Operations) 這里面是我們常說的激活函數(shù)層Activation Layers。
              • EltwiseLayer
              • SoftmaxLayer
              • ArgMaxLayer
              • MVNLayer
        • vision_layer

          • 主要是實現(xiàn)Convolution和Pooling操作, 主要有以下幾個類:
            • ConvolutionLayer 最常用的卷積操作
            • Im2colLayer 與MATLAB里面的im2col類似诫惭,即image-to-column transformation翁锡,轉(zhuǎn)換后方便卷積計算
            • LRNLayer 全稱local response normalization layer,在Hinton論文中有詳細(xì)介紹ImageNet.
              Classification with Deep Convolutional Neural Networks 夕土。
            • PoolingLayer Pooling操作
    • Net

    Net由一系列的Layer組成(無回路有向圖DAG)馆衔,Layer之間的連接由一個文本文件描述瘟判。模型初始化Net::Init()會產(chǎn)生blob和layer并調(diào)用Layer::SetUp。在此過程中Net會報告初始化進程角溃。這里的初始化與設(shè)備無關(guān)拷获,在初始化之后通過Caffe::set_mode()設(shè)置Caffe::mode()來選擇運行平臺CPU或GPU,結(jié)果是相同的减细。

    • Protocol Buffer

      • Protocol Buffer(PB)是一種輕便刀诬、高效的結(jié)構(gòu)化數(shù)據(jù)存儲格式,可以用于結(jié)構(gòu)化數(shù)據(jù)串行化邪财,很適合做數(shù)據(jù)存儲或 RPC 數(shù)據(jù)交換格式。它可用于通訊協(xié)議质欲、數(shù)據(jù)存儲等領(lǐng)域的語言無關(guān)树埠、平臺無關(guān)、可擴展的序列化結(jié)構(gòu)數(shù)據(jù)格式嘶伟。是一種效率和兼容性都很優(yōu)秀的二進制數(shù)據(jù)傳輸格式怎憋,目前提供了 C++、Java九昧、Python 三種語言的 API绊袋。Caffe采用的是C++和Python的API。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末铸鹰,一起剝皮案震驚了整個濱河市癌别,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蹋笼,老刑警劉巖展姐,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剖毯,居然都是意外死亡圾笨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門逊谋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來擂达,“玉大人,你說我怎么就攤上這事胶滋“鬻蓿” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵究恤,是天一觀的道長穗熬。 經(jīng)常有香客問我,道長丁溅,這世上最難降的妖魔是什么唤蔗? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上妓柜,老公的妹妹穿的比我還像新娘箱季。我一直安慰自己,他們只是感情好棍掐,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布藏雏。 她就那樣靜靜地躺著,像睡著了一般作煌。 火紅的嫁衣襯著肌膚如雪掘殴。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天粟誓,我揣著相機與錄音奏寨,去河邊找鬼。 笑死鹰服,一個胖子當(dāng)著我的面吹牛病瞳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悲酷,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼套菜,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了设易?” 一聲冷哼從身側(cè)響起逗柴,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎顿肺,沒想到半個月后嚎于,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡挟冠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年于购,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片知染。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡肋僧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出控淡,到底是詐尸還是另有隱情嫌吠,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布掺炭,位于F島的核電站辫诅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涧狮。R本人自食惡果不足惜炕矮,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一么夫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肤视,春花似錦档痪、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至困后,卻和暖如春乐纸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背摇予。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工汽绢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人趾盐。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像小腊,于是被迫代替她去往敵國和親救鲤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容