圖解NCHW與NHWC數據格式

原文作者:田海立@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數據,看起來是這樣的:

圖解NCHW與NHWC數據格式

人類比較直接的理解方式是3D,上圖中從三個方向上理解,C方向/H方向/W方向。然後是N方向上,就是4D。

上圖中紅色標準的數值是這個數據裡每個元素的數值。

三、物理存儲

無論邏輯表達上是幾維的數據,在計算機中存儲時都是按照1D來存儲的。NCHW和NHWC格式數據的存儲形式如下圖所示:

圖解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與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


分享到:


相關文章: