1x1卷积与完全连接的层如何相同?


55

我最近阅读了Yan LeCuns对1x1卷积的评论

在卷积网中,没有“全连接层”之类的东西。只有带有1x1卷积内核和完整连接表的卷积层。

ConvNets不需要固定大小的输入,这是一个非常罕见的事实。您可以在碰巧产生单个输出矢量(没有空间范围)的输入上训练它们,然后将它们应用于更大的图像。然后,您将获得输出矢量的空间图,而不是单个输出矢量。每个向量都会在输入的不同位置看到输入窗口。 在这种情况下,“完全连接的层”实际上充当1x1卷积。

我想看一个简单的例子。

假设您具有完全连接的网络。它只有一个输入层和一个输出层。输入层有3个节点,输出层有2个节点。这个网络具有32=6参数。为了更加具体,可以说您在输出层和权重矩阵中具有ReLU激活功能

W=(011235)R2×3b=(813)R2

f(x)=ReLU(Wx+b)xR3

卷积层必须看起来如何一样?LeCun对“完整连接表”意味着什么?

23+2=8

Answers:


29

你的例子

在您的示例中,我们有3个输入单元和2个输出单元。要应用卷积,请考虑分别具有shape:[1,1,3]和的那些单元[1,1,2]。用CNN术语来说,我们有3输入和2输出要素图,每个要素图都有空间尺寸1 x 1

n x nk[n,n,k]1x1[1, 1, 3]221×11×1×number of channels of the input


w1=(011)R3w2=(235)R3b=(813)R2

f(x)=ReLU((w1xw2x)+(b1b2))xR3

实代码转换

对于一个真实的例子,还可以看看我的vgg-fcn实现。该文件中提供的代码采用VGG权重,但是将每个完全连接的层转换为卷积层。所得网络产生的输出与vgg应用于shape的输入图像时的输出相同[244,244,3]。(当同时应用两个网络而没有填充时)。

转换后的卷积层被引入到函数中_fc_layer(第145行)。它们具有内核的大小7x7为FC6(这是最大的,因为pool5的VGG输出形状的特征图[7,7, 512]。层FC7FC8作为被实现1x1卷积。

“完整连接表”

我不确定100%,但是他可能指的是与输入要素图具有相同尺寸的过滤器/内核。在这两种情况下(代码和示例),空间尺寸在某种意义上都是最大的,即过滤器的空间尺寸与输入的空间尺寸相同。


“因此,您的1x1卷积的核具有形状[1,1,3]。”。什么?对卷积似乎有更大的误解。我以为如果卷积核的形状为[1,1,3],那么有人会说它是1x1x3卷积?那么1x1卷积仅与输出有关,与内核无关吗?
Martin Thoma

2
对我来说kernel = filter,你同意吗?>>“所以1x1的卷积大约只有输出,而不是关于内核吗?根本不是。一个3x3卷积可以有任意的输出状态。”的确,如果使用填充和stride=1随后的output shape = input shape。>>“我以为如果卷积核的形状为[1,1,3],那么有人会说它是1x1x3卷积?” 不,我从未听过有人在谈论3x3x512卷积。但是,我见过的所有卷积滤波器都具有等于输入层特征图数量的第三空间维。
MarvMind

作为参考,请查看Convolution DemoKarpathies CS321n课程:cs231n.github.io/convolutional-networks/#conv。或在tensorflow API上:tensorflow.org/versions/r0.9/api_docs/python/nn.html#conv2d过滤器应该具有shape [filter_height, filter_width, in_channels, out_channels]
MarvMind

我可以在答案中加上“ 1x1卷积是1 x 1 x输入通道数”的东西吗?这就是我困惑的根源,我一直忘记这一点。
马丁·托马

当然,去吧!
MarvMind


2

等效内核只是具有输入的任何形状,并计算张量点积。(我使用“形状”一词,是因为似乎对“尺寸”有些困惑,通常会忽略通道/深度尺寸)。由于内核尽可能大,因此无需涉及“跨输入滑动内核”。引用斯坦福CS 231n课程注释

任何FC层都可以转换为CONV层。例如,一个K = 4096的FC层正在看一些7×7×512大小的输入体积,可以等效地表示为一个CONV层,其F = 7,P = 0,S = 1,K = 4096,F = 7,P = 0,S = 1,K = 4096。换句话说,我们将过滤器的大小设置为恰好是输入体积的大小,因此输出将仅为1×1×4096,因为只有单个深度列“适合”整个输入体积,因此得出的结果与初始FC层。

我相信“ F = 7,P = 0,S = 1,K = 4096,F = 7,P = 0,S = 1,K = 4096”在这里意味着每个conv内核的形状为7x7x512,并且有4096个这样的过滤器。

较早的答案提到AlexNet的最后一个fc(接收形状为1x1x4096的输入并计算1000个类分数)被实现为“ 1x1卷积”。为了完整起见,每个这样的转换内核的形状均为1x1x4096,其中有1000个。

Le Cunn还在CNN论文第8页LeNet5的说明中对此进行了解释:

C5层是具有120个特征图的卷积层。每个单元都连接到S4的所有16个特征图上的5x5邻域。这里,因为S4的大小也是5x5,所以C5的特征图的大小是1x1。这等于S4和C5之间的完全连接。


1

对于像我这样的新手PyTorch用户- 不要将“完全连接的层”与“线性层”混淆。

线性层和1x1卷积是一回事。我花了一段时间才了解没有所谓的“完全连接的层”-它只是将空间尺寸展平为一维巨型张量。展平会使所有空间位置上的每个元素都显示为单独的要素地图/通道/维度(无论您要调用什么)。因此,当我们在展平的张量上应用线性层时,我们将获得完全连接的操作,这显然与1x1卷积不同。

1x1j=01X[j]W0[j]+b[0]j=01X[j]W1[j]+b[1]j=01X[j]W2[j]+b[2]

O=W2×3X3×1+b2×1

声称完全连接的层只是大小输入的有效 nxn卷积层的其他答案nxn令人困惑(尽管正确)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.