深度學習 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<vector<Blob*> >
top_vecs_存放每一層中的輸出數據類型為:vector<vector<Blob*> >
available_blobs存放每一層中的輸出數據類型為:vector<vector<Blob*> >

##常規的數據鏈建立流程是(單輸入單輸出的場景):

  1. 鏈接本層的bottom數據( int Net::AppendBottom(const NetParameter& param, const int layer_id, const int bottom_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx) ),該函數會使用從當前layer持有的bottom信息中得到對應bottom的層名,然后利用該名稱找到對應的blob,并加入到bottom_vecs_。

  2. 鏈接本層的top數據(void Net::AppendTop(const NetParameter& param, const int layer_id,const int top_id, set<string>* available_blobs, map<string, int>* blob_name_to_idx)),該操作就是將本層的輸出數據加入到top_vecs_中,并與 layer_id相關聯,這里同時負責Blob對象的申請。 需要指出的是,新的Blob對象是在top中進行創建的,在Bottom中只是將上一層top的指針添加進來,同時在這個過程中CAFFE還利用available_blobs進行了異常校驗,在每次新加入top的時候記錄對應的Blob名稱,在bottom中鏈接上一層top之后,在available_blobs中將對應的Blob名稱剔除。相關偽代碼如下:

     for (int layer_id = 0; layer_id < param.layer_size(); ++layer_id) {AppendBottom();AppendTop();}
    復制代碼

##多輸入的數據鏈的建立: 細心的同學應該已經發現,當數據為多bottom輸入的時候,因為available_blobs的數據被上一次的鏈接過程刪掉,則再次鏈接相同bottom的時候,會出先異常告警,在這種情況下我們就要引入CAFFE的另外一處理函數 void InsertSplits(const NetParameter& param, NetParameter* param_split),該函數的主要功能就是對 top輸出到多個 Layer的情況進行分割。 整個函數分為兩個部分:

  1. 遍歷整個網絡,記錄每一個Layer的top的使用情況,記錄結構放在 top_idx_to_bottom_count中。

  2. 遍歷整個網絡,對 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 < split_count; ++k) {//split_count就是該top被引用的個數//添加了分割后的top//命名由SplitBlobName生成		    split_layer_param->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的填充和初始圖片的輸入并沒有進行分析。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275197.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C#中的Clipboard與ContextMenuStrip應用舉例

今天&#xff0c;突然想起了怎樣在一個文本中實現復制、剪切與粘貼的功能&#xff0c;并給這些功能添加右鍵的快捷方式。于是&#xff0c;就用自己的VS2008寫了一個簡單的小應用&#xff0c;以熟悉C#中剪貼板與快捷菜單的使用。 首先&#xff0c;我們不難發現&#xff0c;剪貼板…

控制臺ui_設計下一代控制臺UI

控制臺ui游戲UX (GAMES UX) Yesterday’s Sony presentation showed us the final look of the PlayStation 5, as well as an impressive of next-gen games that will be released with it. What we didn’t get to see, however, is the new operating system and it’s use…

寫給前端新手看的一些模塊化知識

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信ruochuan12 進群參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行三個月了&#xff0c;很多小伙伴表示收獲頗豐。一、 為什么需要模塊化以前沒有模塊化時…

重學前端學習筆記(八)--JavaScript中的原型和類

筆記說明 重學前端是程劭非&#xff08;winter&#xff09;【前手機淘寶前端負責人】在極客時間開的一個專欄&#xff0c;每天10分鐘&#xff0c;重構你的前端知識體系&#xff0c;筆者主要整理學習過程的一些要點筆記以及感悟&#xff0c;完整的可以加入winter的專欄學習【原文…

代碼實現照片素描_我的代碼素描之旅

代碼實現照片素描In 2018 I started the process of consistently creating and posting my code sketches online. These are small animations I make with code and post on instagram. Through these sketches I tried to visually express my ideas using color, animatio…

GCC參數詳解

轉自&#xff1a;http://www.cnblogs.com/fence/archive/2009/12/18/1627138.html GCC參數詳解 gcc and g分別是gnu的c & c編譯器 gcc/g在執行編譯工作的時候&#xff0c;總共需要4步1.預處理,生成.i的文件[預處理器cpp]2.將預處理后的文件不轉換成匯編語言,生成文件.s[編…

真效率神器,UI稿智能轉換成前端代碼,準確率極高

大家好&#xff0c;我是若川。在這充滿網絡促銷活動的幾個月&#xff0c;倍感壓力的&#xff0c;除了你的口袋&#xff0c;是否還有程序員的發量呢&#xff1f;每年的雙十一、雙十二購物狂歡節&#xff0c;各大電商平臺都會上線讓消費者充滿購買欲望的活動頁面&#xff0c;而這…

PPT圖標的正確使用和插入與編輯形狀

PPT圖標的正確使用和插入與編輯形狀 通過圖標可以以符號的形式直觀地傳遞信息。 一&#xff0c;實戰&#xff1a;在銷售工作計劃中插入圖標 PowerPoint 2016中提供了多種類型的圖標&#xff0c;用戶可根據需要在幻燈片中插入所需的圖標。 二&#xff0c;實戰&#xff1a;更改銷…

幾個用于序列化的代碼片段

參考JavaScriptSerializer,一般用來做JSON格式化http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptserializer.aspx http://msdn.microsoft.com/zh-cn/library/system.web.script.serialization.javascriptconverter.aspxDataContractSeria…

桌面圖標擺放圖案_用圖標制作醒目的圖案

桌面圖標擺放圖案Level up your video calls with a custom backdrop created using Noun Project icons.使用使用Noun Project圖標創建的自定義背景來升級視頻通話。 The only thing more visually pleasing than a well-designed icon is a neat, eye-catching pattern made…

3個多月,近3000人參與的源碼共讀,誠邀加入~

大家好&#xff0c;我是若川。眾所周知&#xff0c;從8月份開始&#xff0c;我組織了源碼共讀活動&#xff0c;每周學習200行左右的源碼&#xff0c;到現在持續了3個多月&#xff0c;堅持答疑解惑。幫助了不少人&#xff0c;還是挺開心的。另外&#xff0c;涌現了很多優秀的讀者…

upc 組隊賽18 STRENGTH【貪心模擬】

STRENGTH 題目鏈接 題目描述 Strength gives you the confidence within yourself to overcome any fears, challenges or doubts. Feel the fear and do it anyway! If you have been going through a rough time and feel burnt out or stressed, the Strength card encourag…

JSONNull

最近用JSONObject&#xff0c;感覺比xml好用一些&#xff0c;json的打包和解包都比較清晰和容易&#xff0c;最近遇到一個問題&#xff0c;將一個JSON對象解析&#xff0c;存到hashmap中去&#xff0c;然后再從hashmap取出數據&#xff0c;遇到jsonnull的問題&#xff0c;本以為…

“這張圖告訴你什么?”

For data to be impactful, it must be understood.為了使數據具有影響力&#xff0c;必須理解它。 I’ve happily spent hundreds and hundreds of hours of my life watching users misunderstand data visualizations. I’m strangely hooked on it.我快樂地度過了數百個小…

我們從 UmiJS 遷移到了 Vite

大家好&#xff0c;我是若川。最近組織了源碼共讀活動&#xff0c;感興趣的可以點此加我微信ruochuan12 進群參與&#xff0c;每周大家一起學習200行左右的源碼&#xff0c;共同進步。已進行三個月了&#xff0c;很多小伙伴表示收獲頗豐。我們從 UmiJS遷移到 Vite 已經上線半年…

將DataTable的內容以EXCEl的形式導出到本地

1.在搞項目的時候一般會遇到&#xff0c;將GridView或者Repeater的內容以Excel的形式保存到本地&#xff0c;即導出功能。我總結了兩個方法。 方法一&#xff1a; 1 DataTable dt query.GetItems().GetDataTable();2 if (dt ! null)3 {4 …

智能家居數據庫設計_設計更智能的數據表

智能家居數據庫設計重點 (Top highlight)Data tables are hard. There are many different ways to think about them. So, naturally, the first step would be to figure out what your users need.數據表很難。 有許多不同的方式來考慮它們。 因此&#xff0c;自然地&#x…

可能是全網首個前端源碼共讀活動,誠邀你加入一起學習

大家好&#xff0c;我是若川。眾所周知&#xff0c;從8月份開始&#xff0c;我組織了源碼共讀活動&#xff0c;每周學習200行左右的源碼&#xff0c;到現在持續了3個多月&#xff0c;堅持答疑解惑。幫助了不少人&#xff0c;還是挺開心的。另外&#xff0c;涌現了很多優秀的讀者…

vsftpd 的配置項目

基本配置說明&#xff1a; 1&#xff09;local_root/ftpfile(當本地用戶登入時&#xff0c;將被更換到定義的目錄下&#xff0c;默認值為各用戶的家目錄) 2&#xff09;anon_root/ftpfile(使用匿名登入時&#xff0c;所登入的目錄) 3&#xff09;use_localtimeYES(默認是GMT時…

線段樹專輯——pku 3667 Hotel

http://poj.org/problem?id3667 哈哈&#xff0c;經典中的經典題啊。利用線段樹求最大連續空閑區間&#xff0c;并返回空閑區間的起點坐標。 View Code 1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 6 …