我正在看一些CNN文章。我看到他们将输入图像转换为(channel, width, height)
。
来自MXNET CNN Tutorial的代码示例。
def transform(data, label):
# 2,0,1 means channels,width, height
return nd.transpose(data.astype(np.float32), (2,0,1))/255, label.astype(np.float32)
谁能解释为什么我们要进行这种转变?
最佳答案
二维卷积有几种图像格式,主要有:
通道优先或NCHW
格式,即(batch, channels, height, width)
。
通道倒数或NHWC
格式,即(batch, height, width, channels)
。
它们基本上是等效的,并且可以很容易地从一种转换为另一种,尽管有证据表明,当使用一种特定的数据格式时,某些低级实现会更有效地执行(请参见this question)。
计算引擎通常接受两种格式,但是具有不同的默认值,例如
Tensorflow accepts both并默认使用NHWC
。
Theano accepts仅NCHW
格式。
Keras也可以同时使用两者,并且具有dedicated setting。默认情况下,最新版本还使用NHWC
。
MXNet也为accepts both formats,但默认值为NCHW
:
默认数据布局为NCHW
,即(batch_size, channel, height, width)
。我们可以选择其他布局,例如NHWC
。
这个默认值几乎是重塑张量的唯一原因,只是避免在网络中使用layout
参数。