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按照從左到右,從上到下的順序,逐列、逐行、逐通道、逐張圖像,將每個像素值存入內存:
也就是說Blob的組織格式並無特別之處,順序存儲而已。坐標位置(n, c, h, w)與具體內存讀取位置M的換算公式如下:
M = (((n × C) + c) × H + h) × W + w