【caffe】基本数据结构blob
@tags: caffe blob
blob是caffe中的基本數(shù)據(jù)結(jié)構(gòu),簡(jiǎn)單理解就是一個(gè)“4維數(shù)組”。但是,這個(gè)4維數(shù)組有什么意義?
 BTW,TensorFlow這款google出的框架,帶出了tensor(張量)的概念。雖然是數(shù)學(xué)概念,個(gè)人還是傾向于簡(jiǎn)單理解為“多維數(shù)組”,那么放在這里,caffe的blob就相當(dāng)于一個(gè)特殊的tensor了。而矩陣就是二維的張量。
anyway,看看blob的4個(gè)維度都代表什么:
num: 圖像數(shù)量 channel:通道數(shù)量 width:圖像寬度 height:圖像高度caffe中默認(rèn)使用的SGD隨機(jī)梯度下降,其實(shí)是mini-batch SGD
 每個(gè)batch,就是一堆圖片。這一個(gè)batch的圖片,就存儲(chǔ)在一個(gè)blob中。
當(dāng)然,blob并不是這么受限的、專門給batch內(nèi)的圖片做存儲(chǔ)用的。實(shí)際上,參數(shù)、梯度,也可以用blob存儲(chǔ)的。只要是caffe的網(wǎng)絡(luò)中傳遞的數(shù)據(jù),都可以用blob存儲(chǔ)。
而且,blob實(shí)際上也并不一定是4維的。它在實(shí)現(xiàn)上其實(shí)就是1維的指針,而我們作為用戶感受到的“多個(gè)維度”是通過shape來操作的。
========= 2016-10-26 20:32:45更新 ==========
在用faster-rcnn訓(xùn)練的時(shí)候使用了ZF網(wǎng)絡(luò),對(duì)于ZF網(wǎng)絡(luò)中的卷積、池化的計(jì)算,這里想自己算一算,結(jié)果發(fā)現(xiàn)對(duì)于卷積網(wǎng)的計(jì)算細(xì)節(jié)還是不太懂,于是找到這篇博客。
一開始對(duì)于博客中的推導(dǎo),1、2=>3這里不理解:
1、首先,輸入圖片大小是 2242243(這個(gè)3是三個(gè)通道,也就是RGB三種)
2、然后第一層的卷積核維度是 773*96 (所以大家要認(rèn)識(shí)到卷積核都是4維的,在caffe的矩陣計(jì)算中都是這么實(shí)現(xiàn)的);
3、所以conv1得到的結(jié)果是11011096 (這個(gè)110來自于 (224-7+pad)/2 +1 ,這個(gè)pad是我們常說的填充,也就是在圖片的周圍補(bǔ)充像素,這樣做的目的是為了能夠整除,除以2是因?yàn)?是圖中的stride, 這個(gè)計(jì)算方法在上面建議的文檔中有說明與推導(dǎo)的);
第一感覺是,conv1得到的應(yīng)該是110x110x3x96的結(jié)果,而不是110x110x96。后來問了別人,再看看書,發(fā)現(xiàn)自己忽略了一個(gè)細(xì)節(jié),就是卷積之后有一個(gè)∑和sigmoid的兩個(gè)過程,前者是累加,后者是映射到0-1之間。具體到faster-rcnn,∑對(duì)應(yīng)的就是:各個(gè)通道上對(duì)應(yīng)位置做累加;而激活函數(shù)使用的應(yīng)該是ReLU吧。anyway,這里的累加和激活函數(shù)處理后,通道數(shù)就變成了一個(gè);也就是,對(duì)于一個(gè)濾波器,滑窗濾波+累加、激活函數(shù)后,得到的一個(gè)feature map。
再具體點(diǎn)說,這里的濾波器(卷積核),是3維的,(Width,Height,Channel)這樣;我們用它在一個(gè)feature map上按滑窗方式做卷積,其實(shí)是所有Channel上同時(shí)做sliding window的操作;每個(gè)sliding windows位置上,所有通道卷積的結(jié)果累加起來,再送給激活函數(shù)ReLU處理,就得到結(jié)果feature map中的一個(gè)像素的值。
值得注意的是,濾波器的通道數(shù)量,和要處理的feature map的通道數(shù)量,其實(shí)可以不一樣的,可以比feature map維度少一點(diǎn),這相當(dāng)于可以自行指定要選取feature map中的某些channel做卷積操作,相當(dāng)于有一個(gè)采樣的過程,甚至可以僅僅使用一個(gè)channel的卷積結(jié)果。具體例子,可以參考《人工智能(第三版)》(王萬良著)里面的例子,結(jié)合例子中算出的“要學(xué)習(xí)的參數(shù)數(shù)量”來理解。
總結(jié)
在caffe中,Blob類型是(Width,Height,Channel,Number)四元組,表示寬度、高度、通道數(shù)量、數(shù)量(或者叫種類)
圖像本身、feature map、濾波器(kernel),都可以看做是Blob類型的具體例子
一個(gè)“層”,可以理解為執(zhí)行相應(yīng)操作后,得到的結(jié)果。比如,執(zhí)行卷積操作,得到卷積層;執(zhí)行全連接操作,得到全連接層。通常把池化層歸屬到卷積層里面。池化就是下采樣的意思,有最大池化和平均池化等。
對(duì)于一個(gè)卷積層,其處理的“輸入”是多個(gè)feature maps,也就是一個(gè)Blob實(shí)例:(H1,W1,C1,N1),比如(224,224,3,5),表示5張圖像(這里的5,可以認(rèn)為是一個(gè)minibatch的batch size,即圖片數(shù)量)
 卷積操作需要卷積核的參與,卷積核也是Blob的實(shí)例:(H2,W2,C2,N2),比如(7,7,3,96),表示有96個(gè)卷積核,每個(gè)卷積核是一個(gè)3維的結(jié)構(gòu),是7x7的截面、3個(gè)通道的卷積核
 卷積層的輸出也是若干feature maps,也是一個(gè)Blob實(shí)例:(H3,W3,C3,N3),是根據(jù)輸入的feature maps和指定的卷積核計(jì)算出來的。按上面的例子,得到feature map的Blob描述為(110,110,96,5),表示有5個(gè)feature maps,每個(gè)feature map是110x110x96大小。
 通常可以這樣理解:卷積核的個(gè)數(shù),作為結(jié)果feature maps中的通道數(shù)量。
參考
 http://blog.csdn.net/u014114990/article/details/51125776
=========== 2016-10-27 21:06:24 再次update ===========
 其實(shí)上面的理解簡(jiǎn)直是過于瑣碎、過于不到位。其實(shí)CNN的數(shù)據(jù)流動(dòng),包括前向傳播和反向傳播,都是blob經(jīng)過一層,得到一個(gè)新的blob,這個(gè)層通常是卷積操作。這個(gè)卷積是3D卷積,是空間的卷積!簡(jiǎn)言之,每次把空間的一個(gè)長(zhǎng)方體內(nèi)部的元素值累加,即得到結(jié)果feature map中的一個(gè)像素值(通常是滑窗操作,所以說是得到一個(gè)像素值):
feature map --(3D卷積)--> 新的feature map
總結(jié)
以上是生活随笔為你收集整理的【caffe】基本数据结构blob的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: react-router 按需加载
 - 下一篇: IFormattable,ICustom