caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)
深度學習 Caffe 初始化流程理解(數據流建立)
之前在簡書的文章,搬遷過來 ^-^
本文是作者原創,如有理解錯誤,懇請大家指出,如需引用,請注明出處。
#Caffe FeatureMap數據流的建立 ##用語解釋
- FeatureMap: 輸入的圖片信息或者經過多層處理后的圖片信息。
- weights: 只針對卷積層存在的權重系數。
- caffe :文中提到的caffe均指caffed1.0,如果使用caffe2.0會特別指出。
在講解FeatureMap的數據流之前,首先需要明確一下caffe的大體結構,caffe的整體邏輯結構分為3層,分別是Net,Layer和Blob,分別的作用如下:
- Net: 該層處于CAFFE的最頂層,主要負責對模型文件的讀寫,根據模型文件的內容建立相應的Layer,填充對應層的數據并進行相關的調用。
- Layer: 該層是實際的執行單元,常見的如卷積層,Pooling層都是處于這一邏輯層。
- Blob:該層是一個內存管理的模塊,為Layer和Net提供相應的存儲空間,屏蔽上層對于內存分配,CPU,GPU切換的感知。
由上面的講解分層關系不難看出,FeatureMap在整個Caffe框架中,不屬于任何一個Layer,所以它被最頂層的Net層所持有。Net層就需要能夠通過caffe的模型文件推倒出每一層所依賴的輸入,這樣才能構建出一個完整的數據鏈。在這種需求下Caffe引入了兩個定義:
- bottom: Layer的輸入數據。
- top: Layer的輸出數據。 具體的形式如下圖(單輸入和多輸入的情形):
所以Net在調用Layer之前就一定知道了Layer的所需要的輸入數據,也就是需要Net層所持有的Blob變量需要被那些層所引用。這些在模型文件中也有直觀的反應(為了方便截圖,刪除了下圖proto中關于Convlution的參數配置):
上述的工作都在Net的Init(void Net::Init(const NetParameter& in_param))函數里面進行了處理,主要實現的就是根據上圖左側的模型文件得到需要建立的Layer的類型,并將各個Layer間的數據鏈接起來。函數中的關鍵參數如下:
名稱功能in_param存放由protobuf轉換出的模型文件bottom_vecs_存放每一層中的輸入數據類型為:vector >top_vecs_存放每一層中的輸出數據類型為:vector >available_blobs存放每一層中的輸出數據類型為:vector >
##常規的數據鏈建立流程是(單輸入單輸出的場景):
##多輸入的數據鏈的建立: 細心的同學應該已經發現,當數據為多bottom輸入的時候,因為available_blobs的數據被上一次的鏈接過程刪掉,則再次鏈接相同bottom的時候,會出先異常告警,在這種情況下我們就要引入CAFFE的另外一處理函數 void InsertSplits(const NetParameter& param, NetParameter* param_split),該函數的主要功能就是對 top輸出到多個 Layer的情況進行分割。 整個函數分為兩個部分:
下面以SqueezeNet1.1為例,展示了添加新的分割層的實例:
![Upload new_split_layer.jpg failed. Please try again.]
通過這樣一個分割的轉化,達到了對多輸入數據流的建立。
##遺留問題 上面講的是在初始化階段對FeatureMap數據的鏈接關系的建立,但是對于weights的填充和初始圖片的輸入并沒有進行分析。
總結
以上是生活随笔為你收集整理的caffe模型文件解析_深度学习 Caffe 初始化流程理解(数据流建立)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 看完这篇文章,还不懂nginx,算我输
- 下一篇: Java8 函数式对齐约定————Ecl