CNN:为什么图像矩阵变换为(channel, width, height)?
CNN: Why is the image matrix transformed to (channel, width, height)?
我正在浏览一些 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)
谁能解释一下我们为什么要进行这种转换?
二维卷积有几种图像格式,主要有:
- Channel-first 或
NCHW
格式,即 (batch, channels, height, width)
.
- Channel-last 或
NHWC
格式,即 (batch, height, width, channels)
.
它们基本上是等效的,并且可以很容易地从一种转换为另一种,尽管有证据表明某些 low-level 实现在使用特定数据格式时执行效率更高(参见 this question)。
计算引擎通常接受这两种格式,但有不同的默认值,例如
- Tensorflow accepts both 并默认使用
NHWC
。
- Theano accepts 仅
NCHW
格式。
- Keras 也适用于两者,并且有一个 dedicated setting。最新版本也默认使用
NHWC
。
MXNet accepts both formats 也是,但默认是 NCHW
:
The default data layout is NCHW
, namely (batch_size, channel, height, width)
. We can choose other layouts such as NHWC
.
这个默认值几乎是重塑张量的唯一原因,只是为了避免网络中的 layout
参数。
我正在浏览一些 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)
谁能解释一下我们为什么要进行这种转换?
二维卷积有几种图像格式,主要有:
- Channel-first 或
NCHW
格式,即(batch, channels, height, width)
. - Channel-last 或
NHWC
格式,即(batch, height, width, channels)
.
它们基本上是等效的,并且可以很容易地从一种转换为另一种,尽管有证据表明某些 low-level 实现在使用特定数据格式时执行效率更高(参见 this question)。
计算引擎通常接受这两种格式,但有不同的默认值,例如
- Tensorflow accepts both 并默认使用
NHWC
。 - Theano accepts 仅
NCHW
格式。 - Keras 也适用于两者,并且有一个 dedicated setting。最新版本也默认使用
NHWC
。 MXNet accepts both formats 也是,但默认是
NCHW
:The default data layout is
NCHW
, namely(batch_size, channel, height, width)
. We can choose other layouts such asNHWC
.
这个默认值几乎是重塑张量的唯一原因,只是为了避免网络中的 layout
参数。