深度學習 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的輸出資料。
具體的形式如下圖(單輸入和多輸入的情形):
stream_format.jpg
所以Net在呼叫Layer之前就一定知道了Layer的所需要的輸入資料,也就是需要Net層所持有的Blob變數需要被那些層所引用。這些在模型檔案中也有直觀的反應(為了方便截圖,刪除了下圖proto中關於Convlution的引數配置):
proto_example.jpg
上述的工作都在Net的Init(void Net::Init(const NetParameter& in_param)
)函式里面進行了處理,主要實現的就是根據上圖左側的模型檔案得到需要建立的Layer的型別,並將各個Layer間的資料連結起來。函式中的關鍵引數如下:
名稱 | 功能 |
---|---|
in_param | 存放由protobuf轉換出的模型檔案 |
bottom_vecs_ | 存放每一層中的輸入資料型別為:vector |
top_vecs_ | 存放每一層中的輸出資料型別為:vector |
available_blobs | 存放每一層中的輸出資料型別為:vector |
常規的資料鏈建立流程是(單輸入單輸出的場景):
連結本層的bottom資料(
int Net::AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set
),該函式會使用從當前layer持有的bottom資訊中得到對應bottom的層名,然後利用該名稱找到對應的blob,並加入到bottom_vecs_。* available_blobs, map * blob_name_to_idx) -
連結本層的top資料(
void Net::AppendTop(const NetParameter& param, const int layer_id,const int top_id, set
),該操作就是將本層的輸出資料加入到top_vecs_中,並與* available_blobs, map * blob_name_to_idx)
layer_id相關聯,這裡同時負責Blob物件的申請。
需要指出的是,新的Blob物件是在top中進行建立的,在Bottom中只是將上一層top的指標新增進來,同時在這個過程中CAFFE還利用available_blobs進行了異常校驗,在每次新加入top的時候記錄對應的Blob名稱,在bottom中連結上一層top之後,在available_blobs中將對應的Blob名稱剔除。相關虛擬碼如下:for (int layer_id = 0; layer_id
多輸入的資料鏈的建立:
細心的同學應該已經發現,當資料為多bottom輸入的時候,因為available_blobs的資料被上一次的連結過程刪掉,則再次連結相同bottom的時候,會出先異常告警,在這種情況下我們就要引入CAFFE的另外一處理函式 void InsertSplits(const NetParameter& param, NetParameter* param_split)
,該函式的主要功能就是對 top輸出到多個 Layer的情況進行分割。
整個函式分為兩個部分:
遍歷整個網路,記錄每一個Layer的top的使用情況,記錄結構放在
top_idx_to_bottom_count
中。-
遍歷整個網路,對
top_idx_to_bottom_count > 1
的情況進行處理:
a. 首先是對top被多個層使用的Layer進行分割,主要的做法是在該層的後面新建一個Layer ,這個新的Layer的會按照top_idx_to_bottom_count
的個數和約定的分割名稱(SplitBlobName
)去新建top,新增層的程式碼如下(此處只展示核心的建立過程,具體呼叫流程請自行跟蹤)://該函式執行新層的新增 void ConfigureSplitLayer(const string& layer_name, const string& blob_name, const int blob_idx, const int split_count, const float loss_weight, LayerParameter* split_layer_param) { split_layer_param->Clear(); split_layer_param->add_bottom(blob_name); split_layer_param->set_name(SplitLayerName(layer_name, blob_name, blob_idx)); split_layer_param->set_type("Split"); for (int k = 0; k add_top( SplitBlobName(layer_name, blob_name, blob_idx, k)); if (loss_weight) { if (k == 0) { split_layer_param->add_loss_weight(loss_weight); } else { split_layer_param->add_loss_weight(0); } } } }
b. 之後,是對使用同一個top的後續層的bottom的blob進行改名,使用與上一步相同的命名規則進行改名。
下面以SqueezeNet1.1為例,展示了新增新的分割層的例項:
![Upload new_split_layer.jpg failed. Please try again.]
透過這樣一個分割的轉化,達到了對多輸入資料流的建立。
遺留問題
上面講的是在初始化階段對FeatureMap資料的連結關係的建立,但是對於weights的填充和初始圖片的輸入並沒有進行分析。
作者:深度Zz
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2334/viewspace-2812211/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 深度學習 Caffe 初始化流程理解(資料流建立)深度學習
- 深度學習 Caffe 記憶體管理機制理解深度學習記憶體
- 理解Transformer [資料探勘深度學習]ORM深度學習
- 《深度學習:21天實戰Caffe》深度學習
- 【深度學習】深度解讀:深度學習在IoT大資料和流分析中的應用深度學習大資料
- 深度學習---之caffe如何加入Leaky_relu層深度學習
- 深入理解深度學習深度學習
- 讓 PM 全面理解深度學習深度學習
- 拯救深度學習:標註資料不足下的深度學習方法深度學習
- 【caffe2從頭學】:2.學習caffe2
- 深度學習--資料預處理深度學習
- 建立資料mysql庫流程MySql
- Vue原始碼學習之資料初始化Vue原始碼
- 深度學習——資料預處理篇深度學習
- 序列資料和文字的深度學習深度學習
- Caffe原始碼理解2:SyncedMemory CPU和GPU間的資料同步原始碼GPU
- NLP與深度學習(一)NLP任務流程深度學習
- Python深度學習(處理文字資料)--學習筆記(十二)Python深度學習筆記
- 深度學習領域的資料增強深度學習
- (pytorch-深度學習系列)pytorch資料操作PyTorch深度學習
- 深度學習煉丹-資料標準化深度學習
- CQL #1:SQLChain 資料庫建立流程SQLAI資料庫
- 深度學習 SSD的理解和細節分析深度學習
- FastAPI 學習之路(三十二)建立資料庫ASTAPI資料庫
- 流體力學深度學習建模技術研究進展深度學習
- 深度學習常用的資料集,包括各種資料跟影象資料深度學習
- 帶你深入淺出理解深度學習(附資源打包下載)深度學習
- 達觀資料王文廣:如何玩轉自然語言理解和深度學習實踐?深度學習
- 深度學習(一)之MNIST資料集分類深度學習
- Python學習手冊(入門&爬蟲&資料分析&機器學習&深度學習)Python爬蟲機器學習深度學習
- 「雜談」GitHub上最全的機器學習和深度學習資料Github機器學習深度學習
- 《Python機器學習手冊:從資料預處理到深度學習》Python機器學習深度學習
- mysql初始化表資料及插入多條資料學習筆記MySql筆記
- 用三張圖理解深度學習的工作原理深度學習
- django(django學習) 兩張表建立 插入資料Django
- 一份幫助你更好地理解深度學習的資源清單深度學習
- 《精通資料科學:從線性迴歸到深度學習》資料科學深度學習
- 深度學習實驗資料集網站推薦深度學習網站