• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • 深度學習21天實戰caffe學習筆記《7 :Caffe數據結構》

    Caffe數據結構

    一、基本概念


    二、Blob:Caffe的基本存儲單元

    blob
    • 四維數組,維度從低到高(width_,height_,channels_,num_);
    • 用于存儲和交換數據;存儲數據或者權值(data)和權值增量(diff);
    • 提供統一的存儲器接口,持有一批圖像或其他數據、權值、權值更新值;
    • 進行網絡計算時,每層的輸入、輸出都需要通過Blob對象緩沖。

    (1)基本用法

    可自動同步CPU/GPU上的數據;
    #include <vector>
    #include <iostream>
    //將Blob內部值保存到磁盤,或者從磁盤載入內存,可以分別通過ToProto()、FromProto()實現
    #include <caffe/util/io.hpp> //存需要包含這個文件
    #include <caffe/blob.hpp>  #包含頭文件                                                                                              
    using namespace caffe; #命名空間
    using namespace std;
    
    int main(void)
    {
      Blob<float>  a;  #創建Blob對象a
      cout<<"Size :"<<a.shape_string()<<endl;   #打印維度信息 Size :(0)
      a.Reshape(1,2,3,4);
      cout<<"Size :"<<a.shape_string()<<endl; #打印維度信息 Size:1 2 3 4 (24)
                                                                                                                                         float *p = a.mutable_cpu_data();  #修改內部數值 mutable_cpu[gpu]_data[diff]
      float *q = a.mutable_cpu_diff();  #修改內部數值 mutable_cpu[gpu]_data[diff]
      for(int i = 0; i < a.count(); i ++)
     {
            p[i] = i; #將data初始化為1,2,3...
     q[i] =a.count()-1-i ; #將diff初始化為23,22,21...
     }
     a.update(); #執行Update操作,將diff與data融合(這也是CNN權值更新步驟的追蹤實施者)                                   # Update()實現 data=data-diff
    
    BlobProto bp;    #構造一個BlobProto對象
    a.ToProto(&bp,true);  #將a序列化,連通diff(默認不帶)
    WriteProtoToBinaryFile(bp,"a.blob");  #寫入磁盤文件a.blob"
    ReadProtoFromBinaryFileOrDie("a.blob",&bp2)
    Blob<float> b;   #新建一個Blob對象b
    b.FromProto(bp2,true);  #從序列化對象bp2總克隆b(連通形狀)
    
     for(int u = 0; u < a.num(); u ++)
     {
      for(int v = 0; v < a.channels(); v ++) 
       {
         for(int w = 0; w < a.height(); w ++)
         {
    	for(int x = 0; x < a.width(); x ++)
            {
    	  cout<<"a["<<u<<"]["<< v << "][" << w << "][" << x << "] =" << a.data_at(u,v,w,x)<< endl;
       #下標訪問 a[][][][]=-23、-21......21、23
            }
         }
       }
     }
    cout<<"ASUM = " << a.asum_data()<< endl;    #所有元素絕對值之和(L1-范數) ASUM = 288                         cout<<"SUMSQ = " << a.sumsq_data()<< endl;  # 平方和 (L2-范數)SUMSQ = 4600
     return 0; 
    }
    Blobproto對象實現了磁盤、內存之間的數據通信,這對于保存、載入訓練好的模型非常實用。

    (2)數據結構描述

    不用BlobShape和BlobProto二實用ProtoBuffer的原因:
    1>、結構體的序列化/反序列化操作需要額外的編程思想,難以做到接口標準化;
    2>、結構體中包含變長數據時,需要更加細致的工作保證數據完整性。ProtoBuffer將變成最容易出現問題的地方加以隱藏,讓機器自動處理,提高了出的健壯性。

     
    該結構描述了Blob的形狀信息message BlobShape {

    只包括若干int64類型值,分別表示Blob
    每個維度的大小,packed表示這些值在內存
    中緊密排布,沒有空洞
    repeated int64 dim = 1 [packed = true];
     }
      
    該結構描述Blob在磁盤中序列化后的形態message BlobProto {
    可選,包括一個BlobShape對象optional BlobShape shape = 7;
    包括若干護墊元素,
    用于存儲增量信息,元素數目由shape或
    (num,channels,height,width)確定
    ,這些元素在內存總緊密排布
    repeated float data = 5 [packed = true];

    包括若干護墊元素,
    用于存儲增量信息,維度與data粗細一致
    repeated float diff = 6 [packed = true];
    與data并列,知識類型為doublerepeated double double_data = 8 [packed = true];
    與diff并列,只是內心為doublerepeated double double_diff = 9 [packed = true];
      
    可選的維度信息,新版本caffe
    推薦使用shape,而不再后面的值
    // 4D dimensions -- deprecated. Use "shape" instead.
     optional int32 num = 1 [default = 0];
     optional int32 channels = 2 [default = 0];
     optional int32 height = 3 [default = 0];
     optional int32 width = 4 [default = 0];
     }

    (3)Blob煉成法

     Blob是一個模板類,聲明在include/caffe/blob.hpp中,封裝類SyncedMemory類,作為基本計算單元服務Layer、Net、Solver等。

    注意:caffe類中成員變量名都帶有后綴“_”,這樣再返俗世相中容易區分臨時變量和類變量。

    三、Layer:Caffe的基本計算單元

    Layer至少有一個輸入Blob(Bottom Blob)和一個輸出Blob(Top Blob),部分Layer帶有權值和偏置項;
    兩個運算方法:
    前向傳播:對輸入Blob進行某種處理(有權值和騙至西安的Layer會利用這些對輸入進行處理),得到輸出Blob
    反向傳播:對輸出Blob的diff進行某種處理,得到輸入Blob的diff(有權值和偏置項的Layer可能也會計算Blob、偏置項Blob的 diff)

    (1)數據結構描述


    (2)Layer煉成法

    • Layer頭文件位于include/caffe/layer.hpp中;
    • Layer源文件位于src/caffe/layer.cpp中(大部分函數并沒有實現 ,只有虛函數);
    • Layer的相關函數的實現在派生類,具體代碼在src/caffe/layers/*.cpp ;Layer類是一個虛基類,不能直接創建對象。

    四、Net:Caffe中網站的CNN模型,包含若干Layer實例

    (1)基本用法

    • 描述文件   *.prototxt    (models/bvlc_reference_caffenet/deploy.prototxt );
    • Net中既包括Layer對象,又包括Blob對象。Blob對象用于存放每個Layer輸入/輸出中間結果,Layer根據Net描述對指定的輸入Blob進行某些處理(卷積、下采樣、全連接、非線性變換、計算代價函數等),輸出結果放到指定的輸出Blob中。輸入Blob與輸出Blob可能為同一個。
    • 所有的Layer和Blob對象都用名字區分,同名的Blob表示同一個Blob對象。同名的Layer表示同一個Layer對象,Blob和Layer同名不代表他們有任何直接關系。

    (2)數據結構描述

    (3)Net繪成法

    下面有兩類Blob:
    1>、以param開頭的權值Blob:隨著Blob會隨著學習過程而更新,歸屬于“模型”;
    2>、以blob開頭的Layer輸入/輸出Blob:只會隨網絡輸入變化,歸屬于“數據”;
    深度學習的目的就是不斷從“數據”中獲取知識,存儲到“模型”中,應用于后來的“數據”。


    五、機制和策略:能干什么?怎么干?

    • Blob提供數據容器的機制;
    • Layer通過不同的策略使用該數據容器,實現多元化的計算處理過程,同時又提供了深度學習各種基本算法(卷積、下采樣、損失函數計算等)的機制;
    • Net則利用Layer這些機制,組合為更完整的深度學習模型,提供了更加豐富的學習策略。



    版權聲明:本文為Julialove102123原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/Julialove102123/article/details/79159669

    智能推薦

    深度學習Caffe實戰筆記(7)Caffe平臺下,如何調整卷積神經網絡結構

    授人以魚不如授人以漁,紅鯉魚家有頭小綠驢叫驢屢屢。至于修改網絡結構多虧了課題組大師姐老龐,在小米實習回校修整,我問她怎么修改網絡,她說改網絡就是改協議,哎呀,一語驚醒夢中人啊!老龐師姐,你真美!雖然博主之前也想過修改網絡協議試一試,鑒于一直不懂網絡結構中的各個參數是干啥的,所以一直沒去實施,這次終于開始嘗試了。  caffe平臺實現卷積神經網絡實在方便的很啊,只需要一個協議文件定義一下網...

    深度學習Caffe實戰筆記(21)Windows平臺 Faster-RCNN 訓練好的模型測試數據

    前一篇博客介紹了如何利用Faster-RCNN訓練自己的數據集,訓練好會得到一個模型,這篇博客介紹如何利用訓練好的模型進行測試數據。 1、訓練好的模型存放位置 訓練好的模型存放在faster_rcnn-master\output\faster_rcnn_final\faster_rcnn_VOC2007_ZF,把script_faster_rcnn_demo.m文件拷貝到faster_rcnn-m...

    《深度學習——實戰caffe》——caffe模型

    一個完整的深度學習系統最核心的兩個方面是數據和模型。   深度學習模型通常由三部分參數組成: 可學習參數(Learnable Parameter),又稱可訓練參數、神經網絡權系數、權重,其數值由模型初始化參數、誤差反向傳播過程控制,一般不可人工干預。 結構參數(Archetecture Parameter),包括卷積層、全連接層、下采樣層數目、卷積核數目、卷積核大小等描述網絡結構參數,一旦設定好,...

    深度學習Caffe實戰筆記(1)環境搭建

    (1)環境搭建 從知道深度學習開始,就一直想學習使用caffe,礙于各種事情一直沒有如愿,這幾天終于找了個時間搞了一下,打算把學習的過程整理成筆記,包括環境搭建、跑車牌識別數據,跑mnist數據,用Alexnet跑自己的數據,用Siamese網絡跑mnist數據,用Siamese網絡跑自己的數據以及如何調整網絡結構等等。。。。后續我會慢慢更新,筆記的主要內容是如何使用caffe,主要側重于實戰,基...

    《21天實戰caffe》 讀書筆記(六)

    第六天 運行手寫體數字識別例程 1、MNIST數據集 MNIST數據集包括60000個訓練集和10000個測試集,每張圖都已經進行尺寸歸一化、數字居中處理,固定尺寸為28像素*28像素。 MNIST數據集可以在Caffe源碼框架的data/mnist下用get_mnist.sh腳本下載。 MNIST原始數據為4個文件,數據格式描述見下圖。 下載到的原始數據集為二進制文件,需要轉換為LEVELDB或...

    猜你喜歡

    《深度學習——實戰caffe》——初識數據可視化

    首先將caffe的根目錄作為當前目錄,然后加載caffe程序自帶的小貓圖片,并顯示。 圖片大小為360x480,三通道 打開examples/net_surgery/conv.prototxt文件,修改兩個地方 一是將input_shape由原來的是(1,1,100,100)修改為(1,3,100,100),即由單通道灰度圖變為三通道彩色圖。 二是將過濾器個數(num_output)由3修改為16...

    深度學習caffe實戰筆記(4)Windows caffe平臺下跑cifar10

    上一篇博客介紹了如何用alexnet跑自己的數據,能跑自己的數據按理說再跑cifar10應該沒問題了啊,但是想想還是要把cifar10的記錄下來,因為cifar10數據格式是屬于特殊的數據格式,需要用caffe環境把數據轉換文件編譯出來,這也是后面Siamese網絡所必須的一個步驟,說到Siamese網絡,,,,我要再哭5分鐘。好,五分鐘時間到,我們開始train。另外,如果是Ubuntu系統,跑...

    深度學習Caffe實戰筆記(2)用LeNet跑車牌識別數據

    caffe實戰之“車牌識別” 上一篇博客寫了如何在cpu的情況下配置環境,配置好環境后編譯成功,就可以用caffe框架訓練卷積神經網絡了。今天介紹如何在caffe環境下,跑車牌識別的數據,利用的網絡是LeNet,這里只介紹具體caffe實戰步驟,網絡結構不做具體介紹。 1、準備數據 在caffe根目錄下的data文件夾下新建一個mine文件夾,在mine文件夾新建一個tra...

    深度學習Caffe實戰筆記(3)用AlexNet跑自己的數據

    上一篇博客介紹了如何在caffe框架平臺下,用LeNet網絡訓練車牌識別數據,今天介紹用AlexNet跑自己的數據,同樣基于windows平臺下,會比基于Ubuntu平臺下麻煩一些,特別是后面的Siamese網絡,說起Siamese網絡真是一把辛酸一把淚啊,先讓我哭一會,,,,,哭了5分鐘,算了,Siamese網絡的苦水等以后再倒吧,言歸正傳,開始train。 在caffe平臺下,實現用Alexn...

    深度學習Caffe實戰筆記(19)Windows平臺 Faster-RCNN 制作自己的數據集

    萬里長征第一步,就是要制作自己的數據集,過程還是比較繁瑣的,特別是標注的過程,這篇博客先介紹如果制作voc2007自己的數據集用于faster-rcnn訓練,下一篇博客介紹如何用faster-rcnn訓練自己的數據。 1、準備圖像 圖像要用.jpg或者jpeg格式的,如果是png或者其它格式,自己轉換一下就好,圖像名稱要用000001.jpg,只有和VOC2007數據集圖像名稱一致,才能最大限度的...

    精品国产乱码久久久久久蜜桃不卡