Caffe中的Blob資料結構

2021-09-30 18:31:49 字數 2457 閱讀 8818

blob是caffe最基礎的資料結構。它有4維[num_,channels_,height_,width_]

我們通過**來看看

#include

#include

#include

using namespace caffe;

using namespace std;

int main(void)

caffe使用blob結構在cnn網路中儲存、傳遞資料。對於批量2d影象資料,blob的維度為

影象數量n × 通道數c × 影象高度h × 影象寬度w

顯然,在此種場景下,blob使用4維座標定位資料,如(n, c, h, w),其中n為影象序號(0到n-1),c為通道序號(0到c-1),h為影象行序(0到h-1),w為影象列序(0到w-1)。那麼我們如何根據這個座標找到對應的資料呢?要想得到這個問題的答案,就得弄清楚blob在記憶體中的資料組織形式,也就是這批量的2d影象在記憶體中是如何儲存的。其實它的儲存方式很簡單,見下圖:

影象資料依序儲存,單張影象資料按通道序依次儲存,組織形式簡單明瞭。上圖給了三張影象的儲存例子,每張影象的通道數c為3,h為8,w為16。座標(2, 1, 3, 9),代表這是第3張影象、第2個通道、第4行、第10列的畫素值,實際儲存位置為:

(((2 × c) + 1) × h + 3) × w + 9 = (((2 × 3) + 1) × 8 + 3) × 16 + 9  = 953

通俗地講,在記憶體中,第一張影象的第0個畫素值儲存在記憶體的第0個位置,blob按照從左到右,從上到下的順序,逐列、逐行、逐通道、逐張影象,將每個畫素值存入記憶體:

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開始的。

也就是說blob的組織格式並無特別之處,順序儲存而已。座標位置(n, c, h, w)與具體記憶體讀取位置m的換算公式如下:

m = (((n × c) + c) × h + h) × w + w

data_format 預設值為 "nhwc",也可以手動設定為 "nchw"。這個引數規定了 input tensor 和 output tensor 的排列方式。

data_format 設定為 "nhwc" 時,排列順序為 [batch, height, width, channels];

設定為 "nchw" 時,排列順序為 [batch, channels, height, width]。

其中 n 表示這批影象有幾張,h 表示影象在豎直方向有多少畫素,w 表示水平方向畫素數,c 表示通道數(例如黑白影象的通道數 c = 1,而 rgb 彩色影象的通道數 c = 3)。為了便於演示,我們後面作圖均使用 rgb 三通道影象。

兩種格式的區別如下圖所示:

nchw 中,c 排列在外層,每個通道內畫素緊挨在一起,即 'rrrrrrggggggbbbbbb' 這種形式。

nhwc 格式,c 排列在最內層,多個通道對應空間位置的畫素緊挨在一起,即 'rgbrgbrgbrgbrgbrgb' 這種形式。

如果我們需要對影象做彩色轉灰度計算,nchw 計算過程如下:

即 r 通道所有畫素值乘以 0.299,g 通道所有畫素值乘以 0.587,b 通道所有畫素值乘以 0.114,最後將三個通道結果相加得到灰度值。

相應地,nhwc 資料格式的彩色轉灰度計算過程如下:

輸入資料分成多個(r, g, b) 畫素組,每個畫素組中 r 通道畫素值乘以 0.299,g 通道畫素值乘以 0.587,b 通道畫素值乘以 0.114 後相加得到乙個灰度輸出畫素。將多組結果拼接起來得到所有灰度輸出畫素。

以上使用兩種資料格式進行 rgb -> 灰度計算的複雜度是相同的,區別在於訪存特性。通過兩張圖對比可以發現,nhwc 的訪存區域性性更好(每三個輸入畫素即可得到乙個輸出畫素),nchw 則必須等所有通道輸入準備好才能得到最終輸出結果,需要占用較大的臨時空間。

在 cnn 中常常見到 1x1 卷積(例如:用於移動和嵌入式視覺應用的 mobilenets),也是每個輸入 channel 乘乙個權值,然後將所有 channel 結果累加得到乙個輸出 channel。如果使用 nhwc 資料格式,可以將卷積計算簡化為矩陣乘計算,即 1x1 卷積核實現了每個輸入畫素組到每個輸出畫素組的線性變換。

tensorflow 為什麼選擇 nhwc 格式作為預設格式?因為早期開發都是基於 cpu,使用 nhwc 比 nchw 稍快一些(不難理解,nhwc 區域性性更好,cache 利用率高)。

nchw 則是 nvidia cudnn 預設格式,使用 gpu 加速時用 nchw 格式速度會更快(也有個別情況例外)。

caffe中Blob資料結構

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

Caffe資料結構一Blob

blob是caffe的基本儲存單元,用於儲存權值 data 和權值增量 diff blobproto物件實現磁碟,記憶體之間的資料通訊。對於載入,儲存訓練好的模型的權值非常實用。include include include include using namespace caffe using n...

caffe 基本資料結構blob

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