caffe 的架構設計及其依賴包的解析

caffe(全稱,Convolution Architecture For Feature Extraction) 的安裝之因此困難,在於其依賴了大量的第三方開源庫:編程

  • 爲了讀取圖像,以及簡單的圖像處理(拉伸,顏色變化),連接很重的 OpenCV 庫
  • boost(將來會成爲 C++ 的標準,就像STL) 來實現一些 C++11 的特徵
  • HD5/LMDB/LEVELDB 用來作數據 IO(訓練集)
    • 避免大量的碎片文件,ImageNet有幾百萬張圖像,(128k的小文件)
    • 僅僅是 DB,還不是關係型
  • ProtoBuffer(google) 的使用隨處可見
    • 引入 Protocol buffer 技術,省去編寫大量描述性(描述的性質,並不表明可編程性)的 C++ 代碼,好比配置參數,屬性變量等;
      • 這些能夠被 protobuffer 的編譯器自動地生成 .h 文件和 .cc 文件(在同一個文件夾下)
    • 方便序列化,用戶能夠直接閱讀 prototxt 文件,來了解網絡結構;

固然這些若是是放在 Linux 平臺下進行安轉的話,安裝是十分簡單的。網絡

1. Caffe 的基本架構

caffe(torch) 是基於層(前向和後向)的設計思路:架構

  • Blob 模塊,實現了 Tensor(張量,能夠通俗地理解爲多維矩陣的意思) 的功能,保存數量和梯度值,其具備 4 個維度,分別是:優化

    • number,chanel,height,width
  • Layer 模塊,根據輸入(bottom)blob 計算輸出 (top)blob,同時保存權重/梯度(神經網絡,從圖的觀點其實表明着DAG,有向無環圖),ui

  • Net 模塊:由多個 layer 組成,實現 forward/backward 計算;google

  • Solver 模塊, 最優化模塊,利用梯度值更新權重,spa

2. caffe 的訓練方式

  • 須要提早準備數據,保存爲 LMDB/LevelDB 等格式(編寫腳本);
  • 不需編寫 C++ 代碼,直接編寫 .prototxt 定義 Net 對象;
  • 直接編寫 .prototxt 定義 solver 對象;(用於訓練)
  • 經過參數直接執行 caffe 命令進行訓練;

3. 依賴包

  • ProtoBuffer:由 caffe 定義的模型,都須要有一個 solver.prototxt 文件,其中記錄了模型訓練所須要的超參,用 caffe 訓練時會首先讀取該文件,得到其中特定字段的數值,並據此設置內存中模型訓練時的超參數變量值;.net

    using google::protobuf::io::FileInputStream;
    
    
    const char* filename = "solver.prototxt";
    int fid = open(filename, O_RDONLY);
    FileInputStream* input = new FileInputStream(fid);
    
    caffe::SolverParam solver_param;
    
    google::protobuf::TextFormat::Parse(input, &solver_param);
  • BLAS:卷積神經網絡中用到的數學計算主要是矩陣向量的運算,caffe 中調用了 BLAS(Basic Linear Algebra Subprograms,基本線性代數子程序)中的相應方法,最經常使用的 BLAS 實現主要有如下幾種:設計

    • Intel MKL
    • ATLAS
    • OpenBLAS

    caffe 能夠選擇其中其中任意一種,經過對 Makefile.config 編譯文件的配置。Makefile.config 配置文件關於 BLAS 的設置以下所示:code

# BLAS choice:
# atlas for ATLAS (default)
# mkl for MKL
# open for OpenBlas
BLAS := atlas
相關文章
相關標籤/搜索