caffe的基本資料結構

q375010308發表於2015-07-23
1. 結構的生成:caffe的基本結構是採用google的proto庫自動生成的,基本流程就是定義一個配置檔案,副檔名為proto,呼叫proto庫的編譯器編譯這個檔案可以生成相應的類的c++的程式碼。具體的可以參見proto庫的介紹。

下面來介紹caffe中用到的一些結構

2.Blob結構:

a. blob是一個標準的Array,主要負責caffe中資料的儲存(stores)、關聯(communicates)、以及資料的操作(manipulates)。資料在網路結構中要經過正向以及反向轉播的過程,在這個過程中要對於資料進行儲存、資料之間的通訊、以及資料的操作,blob就是負責這個工作的。

在具體的形式上blob是一個4-D結構的array,是按照(Num,Channels,Height and Width)的順序儲存的,這裡的Num相當於minibatch SGD中的batch這樣一個概念。此處據作者的解釋是應為legacy reason。

b. blob中資料的dimentions為Num N*channel K * Height H * Width W.記憶體是行優先的(row-major)。訪問資料的時候按照如下的規則來訪問index(n,k,h,w) 在物理上位於index((n*K + k) *H + h)*W + w. 這裡要注意,index(n,k,h,w)實際上訪問的是記憶體中(n+1,k+1,h+1,w+1)位置的資料,這是因為索引是從0開始的。

N是batch size of data,在ImageNet中這個值是256,Channls是feature dimention對於RGB影象來說K = 3. blob的維度是根據layer的type和configuration不同計算不同的,對於一個有96個filter,11*11的spatialdimension,3個input的blob的conv layer來說,其dimention為96*3*11*11,對於一個有1000個ouput channel以及1024個input channnels的 fully-connected layer來說blob的維度為1*1*1000*4096。

(@Leo_Shaw指出此處的Num應該是filter的數目,這是我看文件不嚴謹的地方,非常感謝@Leo_Shaw指出這個問題。上面的解釋不完全錯,但是隻說明了一個方面,此處做一個小的修正:
caffe文件中指出 blobdimensions vary according to the type and configuration of the layersN代表的含義在不同的層中是不一樣的,在輸入的Data層中,N代表了mini batch size,也就是一次可以處理的影象的數目,在conv層中,N實代表了filter的數目,這是程式碼結構定義方面的問題,和演算法本身沒有關係。

c.blob中的資料訪問方法:const方式以及mutable方式,前者訪問不能改變資料,後者訪問可以改變資料。這種設計主要為了cpu和gpu之間資料的同步,具體的還要深入研究一下。這個有GPU和CPU兩個版本。

d.blob中資料分為兩個chunks一個是data一個是diff,前者是正常的的傳遞的資料,後者是網路計算的gradient。

3. Layer結構:

a. Layer是一個核心的結構,它主要定義了基本的計算單元,也就是每一層的具體形式。這個層包括convolve filter、pools、inner products、loss等不同定義

b. 每一個Layer定義了三個核心的計算:
   
    1)Setup:初始化layer和its connections
    2)Forward:根據從bottom來的輸入計算輸出送到top
    3)Backward:根據top output的gradient計算input的gradient,然後輸送到bottom。同時還會計算相對於parameters的gradient,並在內部儲存


4. Net結構:

a.Net是一個DAG/directed acyclic graph,其節點就是一個個的Layer結構,net從data layer開始,以loss layer結束。

b.通過呼叫Net::Init()來初始化net,初始化做了兩個工作,一個是建立blobs和layers,呼叫layer::setup(),一個是做一些bookkeeping的事情,比如驗證網路結構的有效性,輸出一些log等。在net建立後,則根據Caffe::mode()使用cpu或者gpu進行計算。

5. 總結

在caffe裡面這幾個關鍵的結構中,blob負責的是資料的儲存,Layer負責了資料計算的傳輸,而net則將前兩者又包了一層,net將會扔到slover(關於slover後邊再分析)中進行最終的學習。

相關文章