caffe 基本資料結構blob

2021-09-08 19:39:55 字數 2837 閱讀 9565

@tags: caffe blob

blob是caffe中的基本資料結構,簡單理解就是乙個「4維陣列」。但是,這個4維陣列有什麼意義?

btw,tensorflow這款google出的框架,帶出了tensor(張量)的概念。雖然是數學概念,個人還是傾向於簡單理解為「多維陣列」,那麼放在這裡,caffe的blob就相當於乙個特殊的tensor了。而矩陣就是二維的張量。

anyway,看看blob的4個維度都代表什麼:

num: 影象數量

channel:通道數量

width:影象寬度

height:影象高度

caffe中預設使用的sgd隨機梯度下降,其實是mini-batch sgd

每個batch,就是一堆。這乙個batch的,就儲存在乙個blob中。

當然,blob並不是這麼受限的、專門給batch內的做儲存用的。實際上,引數、梯度,也可以用blob儲存的。只要是caffe的網路中傳遞的資料,都可以用blob儲存。

而且,blob實際上也並不一定是4維的。它在實現上其實就是1維的指標,而我們作為使用者感受到的「多個維度」是通過shape來操作的。

*****==== 2016-10-26 20:32:45更新 **********

在用faster-rcnn訓練的時候使用了zf網路,對於zf網路中的卷積、池化的計算,這裡想自己算一算,結果發現對於卷積網的計算細節還是不太懂,於是找到這篇部落格。

一開始對於部落格中的推導,1、2=>3這裡不理解:

1、首先,輸入大小是 2242243(這個3是三個通道,也就是rgb三種)

2、然後第一層的卷積核維度是 773*96 (所以大家要認識到卷積核都是4維的,在caffe的矩陣計算中都是這麼實現的);

3、所以conv1得到的結果是11011096 (這個110來自於 (224-7+pad)/2 +1 ,這個pad是我們常說的填充,也就是在的周圍補充畫素,這樣做的目的是為了能夠整除,除以2是因為2是圖中的stride, 這個計算方法在上面建議的文件中有說明與推導的);

第一感覺是,conv1得到的應該是110x110x3x96的結果,而不是110x110x96。後來問了別人,再看看書,發現自己忽略了乙個細節,就是卷積之後有乙個∑和sigmoid的兩個過程,前者是累加,後者是對映到0-1之間。具體到faster-rcnn,∑對應的就是:各個通道上對應位置做累加;而啟用函式使用的應該是relu吧。anyway,這裡的累加和啟用函式處理後,通道數就變成了乙個;也就是,對於乙個濾波器,滑窗濾波+累加、啟用函式後,得到的乙個feature map。

再具體點說,這裡的濾波器(卷積核),是3維的,(width,height,channel)這樣;我們用它在乙個feature map上按滑窗方式做卷積,其實是所有channel上同時做sliding window的操作;每個sliding windows位置上,所有通道卷積的結果累加起來,再送給啟用函式relu處理,就得到結果feature map中的乙個畫素的值。

值得注意的是,濾波器的通道數量,和要處理的feature map的通道數量,其實可以不一樣的,可以比feature map維度少一點,這相當於可以自行指定要選取feature map中的某些channel做卷積操作,相當於有乙個取樣的過程,甚至可以僅僅使用乙個channel的卷積結果。具體例子,可以參考《人工智慧(第三版)》(王萬良著)裡面的例子,結合例子中算出的「要學習的引數數量」來理解。

總結

在caffe中,blob型別是(width,height,channel,number)四元組,表示寬度、高度、通道數量、數量(或者叫種類)

影象本身、feature map、濾波器(kernel),都可以看做是blob型別的具體例子

乙個「層」,可以理解為執行相應操作後,得到的結果。比如,執行卷積操作,得到卷積層;執行全連線操作,得到全連線層。通常把池化層歸屬到卷積層裡面。池化就是下取樣的意思,有最大池化和平均池化等。

對於乙個卷積層,其處理的「輸入」是多個feature maps,也就是乙個blob例項:(h1,w1,c1,n1),比如(224,224,3,5),表示5張影象(這裡的5,可以認為是乙個minibatch的batch size,即數量)

卷積操作需要卷積核的參與,卷積核也是blob的例項:(h2,w2,c2,n2),比如(7,7,3,96),表示有96個卷積核,每個卷積核是乙個3維的結構,是7x7的截面、3個通道的卷積核

卷積層的輸出也是若干feature maps,也是乙個blob例項:(h3,w3,c3,n3),是根據輸入的feature maps和指定的卷積核計算出來的。按上面的例子,得到feature map的blob描述為(110,110,96,5),表示有5個feature maps,每個feature map是110x110x96大小。

通常可以這樣理解:卷積核的個數,作為結果feature maps中的通道數量。

參考

**********= 2016-10-27 21:06:24 再次update **********=

其實上面的理解簡直是過於瑣碎、過於不到位。其實cnn的資料流動,包括前向傳播和反向傳播,都是blob經過一層,得到乙個新的blob,這個層通常是卷積操作。這個卷積是3d卷積,是空間的卷積!簡言之,每次把空間的乙個長方體內部的元素值累加,即得到結果feature map中的乙個畫素值(通常是滑窗操作,所以說是得到乙個畫素值):

feature map --(3d卷積)--> 新的feature map

caffe 基本資料結構blob

tags caffe blob blob是caffe中的基本資料結構,簡單理解就是乙個 4維陣列 但是,這個4維陣列有什麼意義?btw,tensorflow這款google出的框架,帶出了tensor 張量 的概念。雖然是數學概念,個人還是傾向於簡單理解為 多維陣列 那麼放在這裡,caffe的blo...

caffe 基本資料結構blob

blob是caffe中的基本資料結構,簡單理解就是乙個 4維陣列 但是,這個4維陣列有什麼意義?btw,tensorflow這款google出的框架,帶出了tensor 張量 的概念。雖然是數學概念,個人還是傾向於簡單理解為 多維陣列 那麼放在這裡,caffe的blob就相當於乙個特殊的tensor...

caffe中Blob資料結構

blob資料結構是caffe中基本的資料儲存單元,它主要儲存的資料是網路中的中間資料變數,比如各層的輸入和輸出 代價函式關於網路各層引數的梯度。為什麼要專門為資料設計乙個儲存結構,我的理解是這樣保證的網路中的資料儲存結構的統一性,由於網路中每個網路的計算過程都是相似的,所以如果能把資料儲存也統一起來...