我看到了两种类型的数据:第一频道和最后一频道在卷积网络的世界里。
根据许多网站的说法,“频道优先”指的是NCHW
格式,而“最后频道”则相当于NHWC
格式。这一点很明显,因为在通道优先格式中,C
位于H
和W
之前。然而,ARM似乎已经将“信道优先”定义为NHWC
,正如您在本论文中所看到的那样。
P6:最常见的两种图像数据格式是信道宽度-高度(CHW),即信道的最后一种,以及高度-宽度-通道(HWC),即信道优先。尺寸顺序与数据步长相同。在HWC格式中,沿信道的数据以1的步长存储,沿宽度的数据以信道计数的步长存储,沿高度的数据以(信道计数×图像宽度)的步长存储。
这也是合理的,因为“频道第一”听起来像是MAC操作按频道进行,如下所示:
for (N){
for (H){
for (W){
for (C){
}
}
}
}
所以对频道没有固定的定义--第一频道还是最后频道,不是吗?
另外,我不确定当你说NHWC
或NCHW
时,你具体指的是什么?我想重要的是算法和内存中的数据排列的结合。如果数据以NHWC
格式输入,则需要像这样设计算法。
而且,由于NHWC
和NCHW
没有固定的定义,我认为如果只说PyTorch是NCHW
、通道优先或其他什么,而不提及数据是如何在内存中排列的话,那就没有任何意义了。
或者当你听到NCHW
时,你会意识到内存中的数据排列类似于ch0[0,0]
,ch1[0, 0]
,ch2[0, 0]
,ch0[1, 0]
,ch1[1, 0]
,ch2[1, 0]
,ch0[2, 0]
,.?
有人能帮我澄清我对数据格式的理解吗?
发布于 2021-08-03 03:15:16
我最初忽略了你所链接的一份文件,它们清楚地定义了两个反对者是如何在文档和其他地方使用这些术语的。对于CHW
和HWC
,确实有两种不同的看法.
TLDR;对于终端用户,CHW
是频道优先,HWC
是最后通道.在这种情况下,我们指的是通道维度相对于其他维度(H
和W
)的位置。无论是在CHW
之前还是在HWC
之后,都是由所使用的图书馆定义的一个惯例问题(例如。PyTorch对Tensorflow)。在内存分配方面,将CHW
信道称为最后一条是有意义的,这意味着通道轴的步长将是最后的:它将在相对于张量的其他轴上最后展开。
如果您只说PyTorch是NCHW、通道优先或其他什么,而不提及数据在内存中的排列方式,我认为这是没有任何意义的。
对于最终用户(如终端开发人员),内存的分配或安排方式并不重要。重要的是要知道如何使用PyTorch提供的API来操作torch.Tensor
s,当我们说NCHW
时,我们指的是‘通道优先’,即形状(batch_size, channel, height, width)
的张量。在所有PyTorch文档页中,您将找到所需的形状、输入和输出张量。这只是碰巧,他们选择坚持NCHW公约的二维通道张量。
坚持一种格式是有意义的,让它适用于底层实现--在内存安排确实重要的地方--或者最终用户本身--他们习惯于使用单一格式。
例如,在TensorFlow中,通道是最后一个,所以使用的格式是NHWC
。
让我们回到HWC
(resp. )CHW
)被命名为频道优先(resp )。在你链接的那份报纸上。这与张量步幅有关:即内存中数据的布局。直观地说,您可以认为格式HWC
是通道优先,因为通道维度是展开的第一个轴。
如果您查看这个示例:
>>> x = torch.rand(2,3,4) # last dimension is the channel axis
tensor([[[0.5567, 0.0276, 0.6491, 0.7933],
[0.2876, 0.0361, 0.3883, 0.3201],
[0.6742, 0.0305, 0.5719, 0.4683]],
[[0.3385, 0.2082, 0.1675, 0.3429],
[0.6146, 0.0533, 0.6147, 0.2216],
[0.1855, 0.6107, 0.1716, 0.0071]]])
实际上,当数据扁平时(假设初始张量的数据在内存中是连续的),实际上显示了潜在的内存数组:
>>> x.flatten()
tensor([0.5567, 0.0276, 0.6491, 0.7933, 0.2876, 0.0361, 0.3883, 0.3201, 0.6742,
0.0305, 0.5719, 0.4683, 0.3385, 0.2082, 0.1675, 0.3429, 0.6146, 0.0533,
0.6147, 0.2216, 0.1855, 0.6107, 0.1716, 0.0071])
注意上面的数据是如何布置的:按通道0.5567, 0.0276, 0.6491, 0.7933
,然后是0.2876, 0.0361, 0.3883, 0.3201
,等等.
在另一种格式(即CHW
)中,它将被设置为0.5567, 0.2876, 0.6742
,然后是0.3385, 0.6146, 0.1855
,等等。
因此,在引用内存中如何分配数据时,调用CHW
通道-最后(HWC
为通道-优先)是有意义的。
https://stackoverflow.com/questions/68634724
复制