深度学习NCHW和NHWC数据格式(由三维数据转换成一维数据的遍历方式)
文章目錄
- 一、基本概念
- 二、邏輯表達
- 三、物理存儲
- 3.1 NCHW
- 3.2 NHWC
- 四、RGB圖像數據舉例
- 五、不同框架支持
流行的深度學習框架中有不同的數據格式,典型的有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很好的描述,目前網絡上絕大多數介紹的圖都來自那里。本文也是直接借助其中的圖來描述的。
參考文章:圖解NCHW與NHWC數據格式
總結
以上是生活随笔為你收集整理的深度学习NCHW和NHWC数据格式(由三维数据转换成一维数据的遍历方式)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux mount挂载命令(将分区挂
- 下一篇: C语言函数strcmp()(比较两个字符