其中 n 表示這批影象有幾張,h 表示影象在豎直方向有多少畫素,w 表示水平方向畫素數,c 表示通道數(例如黑白影象的通道數 c = 1,而 rgb 彩色影象的通道數 c = 3)。為了便於演示,我們後面作圖均使用 rgb 三通道影象。
兩種格式的區別如下圖所示:
nchw 中,c 排列在外層,每個通道內畫素緊挨在一起,即 'rrrrrrggggggbbbbbb' 這種形式。
nhwc 格式,c 排列在最內層,多個通道對應空間位置的畫素緊挨在一起,即 'rgbrgbrgbrgbrgbrgb' 這種形式。
如果我們需要對影象做彩色轉灰度計算,nchw 計算過程如下:
即 r 通道所有畫素值乘以 0.299,g 通道所有畫素值乘以 0.587,b 通道所有畫素值乘以 0.114,最後將三個通道結果相加得到灰度值。
相應地,nhwc 資料格式的彩色轉灰度計算過程如下:
輸入資料分成多個(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 格式。
與 的區別? 與 的區別?
相同點 和 都是表示與的邏輯運算子,其運算結果一致 不同點 邏輯與 當兩邊的表示式都為true的時候,整個運算結果才為true,否則為false。短路與 當第乙個表示式的值為false的時候,則不再計算第二個表示式 注意 還可以做位運算子,當表示式不是boolean型別的時候 例項1 public ...
this 與this的區別
this 與this的區別 相信很多剛接觸jquery的人,很多都會對 this 和this的區別模糊不清,那麼這兩者有什麼區別呢?首先來看看jquery中的 這個符號,實際上這個符號在jquery中相當於jquery 即 this jquery 也就是說,這樣可以返回乙個jquery物件。那麼,當...
a與 a的區別
首先,來一段 void main int ptr int a 1 printf d,d a 1 ptr 1 列印出來的值為多少呢?這裡主要是考查關於指標加減操作的理解。對指標進行加1操作,得到的是下乙個元素的位址,而不是原有位址值直接加1。所 以 乙個型別為t的指標的移動,以sizeof t 為移動...