原文作者:田海立@CSDN
原文地址:https://blog.csdn.net/thl789/article/details/109037433
流行的深度學習框架中有不同的數據格式,典型的有NCHW和NHWC格式。本文從邏輯表達和物理存儲角度用圖的方式來理解這兩種數據格式,最後以RGB圖像為例來加深NHWC和NCHW數據存儲格式的理解。
一、基本概念
深度學習框架中,數據一般是4D,用NCHW或NHWC表達,其中:
N - Batch
C - Channel
H - Height
W - Width
二、邏輯表達
假定N = 2,C = 16,H = 5,W = 4,那麼這個4D數據,看起來是這樣的:
人類比較直接的理解方式是3D,上圖中從三個方向上理解,C方向/H方向/W方向。然後是N方向上,就是4D。
上圖中紅色標準的數值是這個數據裡每個元素的數值。
三、物理存儲
無論邏輯表達上是幾維的數據,在計算機中存儲時都是按照1D來存儲的。NCHW和NHWC格式數據的存儲形式如下圖所示:
3.1 NCHW
NCHW是先取W方向數據;然後H方向;再C方向;最後N方向。
所以,序列化出1D數據:
000 (W方向) 001 002 003,(H方向) 004 005 ... 019,(C方向) 020 ... 318 319,(N方向) 320 321 ...
3.2 NHWC
NHWC是先取C方向數據;然後W方向;再H方向;最後N方向。
所以,序列化出1D數據:
000 (C方向) 020 ... 300,(W方向) 001 021 ... 303,(H方向) 004 ... 319,(N方向) 320 340 ...
四、RGB圖像數據舉例
表達RGB彩色圖像時,一個像素的RGB值用3個數值表示,對應Channel為3。易於理解這裡假定N=1,那麼NCHW和NHWC數據格式可以很直接的這樣表達:
NCHW是
先在一個Channel面上把W方向|H方向上元素存儲起來 // R
然後再在另一個Channel切面上把W方向|H方向上元素存儲起來 // G
最後一個Channel切面上把W方向|H方向上元素存儲起來 // B
這樣看起來,就是先把R通道的每個像素都存儲;然後存儲G通道;再然後B通道。
NHWC是
先把3個Channel上元素存儲起來 // 也就是一個像素的RGB
然後再在W方向|H方向上元素存儲起來
這樣看起來,就是順序地取像素的RGB數值存儲起來
五、不同框架支持
目前的主流ML框架對NCHW和NHWC數據格式做了支持,有些框架可以支持兩種且用戶未做設置時有一個缺省值:
TensorFlow:缺省NHWC,GPU也支持NCHW
Caffe:NCHW
PyTorch:NCHW
【後注】: Intel Math Kernel Library for Deep Neural Networks (Intel MKL-DNN)中有關於NCHW和NHWC 很好的描述,目前網絡上絕大多數介紹的圖都來自那裡。本文也是直接藉助其中的圖來描述的。
原文作者:田海立@CSDN
原文地址:https://blog.csdn.net/thl789/article/details/109037433