Caffe解讀(一)

Caffe 基本架構

理解caffe的架構,包括blob,layer,net,solver,tools的關係等

源碼文件結構

  • tools
    • 保存的源碼是用於生成二進制處理程序的,caffe在訓練時實際是直接調用這些二進制文件
  • include
    • Caffe的實現代碼的頭文件
  • src
    • 實現Caffe的源文件
    • gtest: google test一個用於測試的庫你make runtest時看見的很多綠色RUN OK就是它,這個與caffe的學習無關,不過是個有用的庫
    • caffe: 關鍵代碼:
      • ./test:用gtest測試caffe的代碼
      • ./util:數據轉換時用的代碼
        +注:caffe速度快很大程度得益於內存設計上的優化(blob數據結構採用proto)以及對卷積的優化(部分與im2col相關)
      • ./proto:全稱“Google Protocol Buffer”,是一種數據存儲格式,幫助caffe提速
      • ./layers:深度神經網絡中包含的各層網絡相關代碼
      • ./solvers:各種優化方法的相關代碼
      • blob.cpp:基本的數據結構Blob類
      • common.cpp:Caffe類
      • data_transformer.cpp:輸入數據的基本操作類DataTransformer
      • internal_thread.cpp:使用boost::thread線程庫
      • layer_factory.cpp:網絡層Layer類
      • net.cpp:網絡結構Net類
      • parallel.cpp:多機數據並行
      • solver.cpp:優化方法Solver類
      • syncedmem.cpp:分配內存和釋放內存類CaffeMallocHost,用於同步GPU,CPU數據

Caffe官方說明的三級結構

http://caffe.berkeleyvision.org/tutorial/net_layer_blob.html
blob:數據操作、存儲、交換;
layer:網絡模型集成和計算;
net:整合和連接layer

Blob

  • Blob是Caffe的基本數據結構,具有CPU和GPU之間同步的能力。Caffe的數據存儲和數據交流都是通過blobs,並且提供了一個統一的數據存儲的接口。只要是caffe網絡中傳遞的數據都可以用blob存儲:圖片、參數、梯度…
  • Blob數據維度:4維的數組(number N×channels K×height H×width W)
  • Blob數據存儲:row-major:(n,k,h,w)的存儲物理位置爲((n×K+k)×H+h)×W+w
  • Blob同時保存了data和diff,訪問data或diff的兩種方法:
    1 const Dtype cpu_data() const; //不修改值
    2 Dtype mutable_cpu_data(); //修改值
  • 實例:
    • 一個“層”,可以理解爲執行相應操作後,得到的結果。比如,執行卷積操作,得到卷積層;執行全連接操作,得到全連接層。對於一個卷積層,其處理的“輸入”是多個feature maps,也就是一個Blob實例:(N1,C1,H1,W1),比如(5,3,224,224),表示5張圖像(這裏的5,可以認爲是一個minibatch的batch size,即圖片數量)
    • 卷積操作需要卷積核的參與,卷積核也是Blob的實例:(N2,C2,H2,W2),比如(96,3,7,7),表示有96個卷積核,每個卷積核是一個3維的結構,是7x7的截面、3個通道的卷積核
    • 卷積層的輸出也是若干feature maps,也是一個Blob實例:(N3,C3,H3,W3),是根據輸入的feature maps和指定的卷積核計算出來的。按上面的例子,得到feature map的Blob描述爲(5,96,218,218),表示有5個feature maps,每個feature map是96x218x218大小(通常可以這樣理解:卷積核的個數,作爲結果feature maps中的通道數量)

Layer

  • 模型的基礎、計算的單元:所有的Pooling,Convolusion,apply nonlinearities, load data,compute losses等操作都在這裏實現
  • layer中input data用bottom表示,output data用top表示。每一層定義了三種操作setup(Layer初始化), forward(正向傳導,根據input計算output), backward(反向傳導計算,根據output計算input的梯度)。forward和backward分別有GPU和CPU兩個版本的實現

Net

  • Net由一系列的Layer組成,Layer之間的連接由一個文本文件描述。
  • Net中既包括Blob對象又包括Layer對象:Blob存儲每個Layer輸入和輸出中間結果,Layer根據Net描述對指定的輸入Blob進行計算處理
  • 模型初始化Net::Init()會創建blobs和layers搭建整個網絡,並調用Layer::SetUp。在此過程中Net會報告初始化進程。在初始化之後通過Caffe::set_mode()設置Caffe::mode()來選擇運行平臺CPU或GPU

其他

  • –>solver.prototxt文件被Caffe讀取後,最終會被Caffe解析成一個叫SolverParameter的數據對象
    –>solver.prototxt中定義的net文件train.prototxt也會被Caffe解析成一個叫NetParameter的數據對象
    –>NetParameter中layer的類型LayerParameter,layer被解析成一個LayerParameter的數據對象。以上在caffe.proto中找到Solver/Net/LayerParameter,就可以知道Solver/Net/LayerParameter的所有字段及含義描述

參考

http://www.cnblogs.com/zjutzz/p/5960289.html
http://yufeigan.github.io/
http://blog.csdn.net/savant_ning/article/details/53013627

發佈了12 篇原創文章 · 獲贊 25 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章