NCHW 與NHWC 的區別

圖像數據格式定義了一批圖片數據的存儲順序。在調用 TensorFlow API 時會常常看到 data_format 參數:

  • data_format 默認值爲 "NHWC",也能夠手動設置爲 "NCHW"。這個參數規定了 input Tensor 和 output Tensor 的排列方式。api

  • data_format 設置爲 "NHWC" 時,排列順序爲 [batch, height, width, channels];網絡

  • 設置爲 "NCHW" 時,排列順序爲 [batch, channels, height, width]。ide

其中 N 表示這批圖像有幾張,H 表示圖像在豎直方向有多少像素,W 表示水平方向像素數,C 表示通道數(例如黑白圖像的通道數 C = 1,而 RGB 彩色圖像的通道數 C = 3)。爲了便於演示,咱們後面做圖均使用 RGB 三通道圖像。ui

兩種格式的區別以下圖所示:
設計

NCHW 中,C 排列在外層,每一個通道內像素緊挨在一塊兒,即 'RRRRRRGGGGGGBBBBBB' 這種形式。orm

NHWC 格式,C 排列在最內層,多個通道對應空間位置的像素緊挨在一塊兒,即 'RGBRGBRGBRGBRGBRGB' 這種形式。圖片

若是咱們須要對圖像作彩色轉灰度計算,NCHW 計算過程以下:開發


即 R 通道全部像素值乘以 0.299,G 通道全部像素值乘以 0.587,B 通道全部像素值乘以 0.114,最後將三個通道結果相加獲得灰度值。get

相應地,NHWC 數據格式的彩色轉灰度計算過程以下:
input

輸入數據分紅多個(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 格式速度會更快(也有個別狀況例外)。

最佳實踐:設計網絡時充分考慮兩種格式,最好能靈活切換,在 GPU 上訓練時使用 NCHW 格式,在 CPU 上作預測時使用 NHWC 格式。

參考:

【1】 https://www.tensorflow.org/performance/performance_guide

轉自:
做者:yalesaleng

相關文章
相關標籤/搜索