'Going deep with convolutions' 中的 DepthConcat 操作如何工作?

机器算法验证 神经网络 火炬 卷积神经网络
2022-03-18 02:52:34

阅读Going deep with convolutions我遇到了一个DepthConcat层,它是提议的inception 模块的构建块,它结合了多个不同大小的张量的输出。作者将此称为“过滤器串联”。Torch似乎有一个实现,但我不太明白它的作用。有人可以用简单的话解释吗?

2个回答

我不认为inception 模块的输出大小不同。

在此处输入图像描述

对于卷积层,人们经常使用填充来保持空间分辨率。

其他卷积层中右下角的池化层(蓝框)可能看起来很尴尬。然而,与传统的池化子采样层(红框,stride>1)不同,他们在池化层中使用了 1 的步幅Stride-1 池化层实际上以与卷积层相同的方式工作,但卷积操作被最大操作取代。

所以池化层之后的分辨率也保持不变,我们可以在“深度”维度上将池化层和卷积层连接在一起。

在此处输入图像描述

如上图所示,inception 模块实际上保持了空间分辨率。

当您阅读该白皮书时,我想到了同样的问题,您参考的资源帮助我提出了实施方案。

您引用的 Torch 代码中,它说:

--[[ DepthConcat ]]--
-- Concatenates the output of Convolutions along the depth dimension
-- (nOutputFrame). This is used to implement the DepthConcat layer
-- of the Going deeper with convolutions paper :

深度学习中的“深度”这个词有点含糊。幸运的是,这个SO Answer提供了一些明确性:

在深度神经网络中,深度是指网络的深度,但在这种情况下,深度用于视觉识别,它转换为图像的第三维。

在这种情况下,您有一个图像,此输入的大小为 32x32x3,即(宽度、高度、深度)。随着深度转换到训练图像的不同通道,神经网络应该能够基于此参数进行学习。

因此 DepthConcat 沿深度维度连接张量,深度维度是张量的最后一个维度,在本例中是 3D 张量的第三维度。

DepthConcat 需要使张量在所有维度上都相同,但深度维度除外,正如Torch 代码所说:

-- The normal Concat Module can't be used since the spatial dimensions
-- of tensors to be concatenated may have different values. To deal with
-- this, we select the largest spatial dimensions and add zero-padding
-- around the smaller dimensions.

例如

A = tensor of size (14, 14, 2)
B = tensor of size (16, 16, 3)
result = DepthConcat([A, B])
where result with have a height of 16, a width of 16 and a depth of 5 (2 + 3). 

在此处输入图像描述

在上图中,我们看到了一张 DepthConcat 结果张量的图片,其中白色区域是零填充,红色是 A 张量,绿色是 B 张量。

这是此示例中 DepthConcat 的伪代码:

  1. 查看张量 A 和张量 B 并找到最大的空间维度,在这种情况下,这将是张量 B 的 16 个宽度和 16 个高度大小。由于张量 A 太小并且与张量 B 的空间维度不匹配,因此需要对其进行填充。
  2. 通过将零添加到第一和第二维度,使张量 A 的大小为 (16, 16, 2),用零填充张量 A 的空间维度。
  3. 沿着深度(第 3 个)维度连接填充张量 A 和张量 B。

我希望这可以帮助其他认为相同问题阅读该白皮书的人。