图解NCHW与NHWC数据格式
TensorFlow API 中 NCHW 与 NHWC 的区别
深度学习中的NCHW格式和NHWC格式
假定N = 2,C = 16,H = 5,W = 4,那么这个4D数据如下图所示:
人类比较直接的理解方式是3D,上图中从三个方向上理解,C方向/H方向/W方向。然后是N方向上,就是4D。上图中红色标准的数值是这个数据里每个元素的数值。
无论逻辑表达上是几维的数据,在计算机中存储时都是按照1D来存储的。
NCHW是先取W方向数据;然后H方向;再C方向;最后N方向。
所以,序列化出1D数据:
000 (W方向) 001 002 003,(H方向) 004 005 … 019,(C方向) 020 … 318 319,(N方向) 320 321 …
NHWC是先取C方向数据;然后W方向;再H方向;最后N方向。
所以,序列化出1D数据:
000 (C方向) 020 … 300,(W方向) 001 021 … 303,(H方向) 004 … 319,(N方向) 320 340 …
表达RGB彩色图像时,一个像素的RGB值用3个数值表示,对应Channel为3。易于理解这里假定N=1,那么NCHW和NHWC数据格式可以很直接的这样表达:
这样看起来,就是先把R通道的每个像素都存储;然后存储G通道;再然后B通道。
这样看起来,就是顺序地取像素的RGB数值存储起来。
目前的主流ML框架对NCHW和NHWC数据格式做了支持,有些框架可以支持两种且用户未做设置时有一个缺省值:
TensorFlow:缺省NHWC,GPU也支持NCHW;
TensorFlow 为什么选择 NHWC 格式作为默认格式?因为早期开发都是基于 CPU,使用 NHWC 比 NCHW 稍快一些(不难理解,NHWC 局部性更好,cache 利用率高)。
Caffe:NCHW;
PyTorch:NCHW;
# NCHW [batch,in_channels,in_height,in_weight]
# NHWC [batch,in_height,in_weight,in_channels]
# CHWN [in_channels,in_height,in_weight,batch]
# 转换 NCHW---NHWC
import tensorflow as tf
x = tf.reshape(tf.range(24),[1,2,3,4])
out = tf.transpose(x,[0,2,3,1])
print (x.shape)
print (out.shape)
#转换NHWC--NCHW
import tensorflow as tf
x = tf.reshape(tf.range(24), [1, 3, 4, 2])
out = tf.transpose(x, [0, 3, 1, 2])
print (x.shape)
print (out.shape)
Data Format Descriptions
I/O Formats
Data Formats