Caffe 入門

  1. Caffe的模型需要兩個重要的參數文件,網絡模型和參數配置。分別是.prototxt 以及 .solver.prototex

  2. 繪製網絡模型的時候,可以使用CAFFE中的python/draw_net.py

  3. 網絡模型的輸入爲數據層,數據層是每個模型的最底層,是模型的入口,不僅提供數據的輸入,也提供數據從Blobs轉換成別的格式進行保存輸出。通常數據的預處理(如減去均值, 放大縮小, 裁剪和鏡像等),也在這一層設置參數實現。數據來源可以來自高效的數據庫(如LevelDB和LMDB),也可以直接來自於內存。如果不是很注重效率的話,數據也可來自磁盤的hdf5文件和圖片格式文件。關於數據層的參數設置,可以參考這篇博文http://www.cnblogs.com/denny402/p/5070928.html

  4. 關於*.slover.prototex中的參數理解,可以參考兩篇博文:https://www.zhihu.com/question/24529483 以及 http://www.cnblogs.com/denny402/p/5074049.html
  5. Caffe的Blob結構是caffe進行數據傳輸的內存接口,其是一個標準的數組結構,按照圖像數量N×通道數K×圖像高度H×圖像寬度W進行排列,按行爲主存儲。由於blob中最重要的是values 和 gradients兩類數據,所以,blobs存儲單元中對應data和diff兩個數據節點,前者是網絡中傳遞的普通數據,後者是通過網絡計算得到的梯度。Blob數據既可以存儲在CPU上,又可以存儲在GPU上,因此有兩種數據訪問方法,靜態不改變數值的方法(只讀),和動態改變數值的方法(可寫),參照這篇文章http://blog.csdn.net/u011037837/article/details/52420953
  6. caffe中的layer是網絡執行計算的核心單元,一個layer包含3中基本操作:初始化setup,重置layer及相互之間的連接,forward從bottom中接受數據,計算前向傳播後輸出到top層,backward:給定top層的輸出梯度,計算輸入的梯度並傳遞到bottom層. Layer中input data用bottom表示output data用top表示。每一層定義了三種操作setup(Layer初始化), forward(正向傳導,根據input計算output), backward(反向傳導計算,根據output計算input的梯度)。forward和backward有GPU和CPU兩個版本的實現。
  7. Net由一系列的Layer組成(無迴路有向圖DAG),Layer之間的連接由一個文本文件描述。模型初始化Net::Init()會產生blob和layer並調用Layer::SetUp。在此過程中Net會報告初始化進程。這裏的初始化與設備無關,在初始化之後通過Caffe::set_mode()設置Caffe::mode()來選擇運行平臺CPU或GPU,結果是相同的。
  8. Caffe slover通過協調Net的前向推斷計算和反向梯度計算對參數進行更新,從而減小loss的目的。其學習過程分爲兩個部分:Solver優化,更新參數,以及Net計算loss和gradient
  9. 每一次solver迭代完成以下工作:

    • 調用前向過程計算輸出和loss
    • 調用後向計算梯度
    • 根據solver方法,利用梯度更新參數
    • 根據學習率,歷史數據和求解方法更新solver狀態(可以週期性的記錄solver的快照)
  10. 關於VGG
    VGG與AlexNet相比,出來使用更多層以外,VGGNet所有的卷積層都是同樣大小的kernel,尺寸爲3*3,卷積間隔爲1,同時有padding。VGGNet的網絡模型特點如下:

    • 3*3是最小能捕捉上下左右和中心概念尺寸
    • 兩個3*3就是5*5的卷積層,可以替代大的kernel尺寸
    • 多個3*3卷積比一個大尺寸的kernel卷積有更多的非線性,是的判別函數更加有力的表達
    • 多個3*3的卷積層比一個大尺寸的kernel有更少的參數
  11. VGGNet相比AlexNet只需要很少的迭代次數就可以收斂,原因如下:

    • 更深的網絡和較小的kernel尺寸具有隱式的規則作用
    • 先訓練淺層網絡,在得到A網絡的參數後,訓練更深的網絡E,同時使用A中得到的參數初始化對應的層
    • 針對多尺度多分辨率的處理:直接訓練一個分類器,每次數據輸入時,每張圖片被隨機重新縮放在一個尺度範圍內,然後訓練網絡。卷積神經網絡對與縮放有一定的不變性,通過multi-scale訓練可以增加這種不變形的能力。
  12. 關於caffe的調試

    • 首先,寫.prototxt文件後,放到網上的網絡可視化網站上驗一下網絡是不是寫對了,例如這個網站https://ethereon.github.io/netscope/#/editor 或者用caffe/python/draw.py來看網絡結構
    • run一下網路,看到loss是下降的,一般不會有大的錯
    • 用python 將.prototxt代表的網絡結構導入進python環境,之後import caffe,運行一次net.forward(),查看每一個blobs中的輸出以及parameter的輸出,尤其是輸入數據如果是圖片的話,可以使用opencv打開輸入圖片看是否正常,在使用backword看下輸出的梯度是否正常
    • 使用caffe只能從其中的固定結構中搭建網絡,但是如果要自己創造一種網絡層的話,需要自己寫c++代碼,這個時候測試這部分對不對,可以使用gdb或者使用caffe/src/caffe/test中的代碼測試
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章