1x1 卷积与全连接层有何相同之处?

数据挖掘 神经网络 卷积神经网络
2021-10-04 19:47:30

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

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

ConvNets 不需要固定大小的输入,这是一个很少被理解的事实。

您可以在碰巧产生单个输出向量(没有空间范围)的输入上训练它们,然后将它们应用于更大的图像。

然后,您将获得输出向量的空间图,而不是单个输出向量。每个向量在输入的不同位置看到输入窗口。 在这种情况下,“全连接层”实际上充当 1x1 卷积。

我想看一个简单的例子。

例子

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

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

所以网络是 f(x)=ReLU(Wx+b)xR3.

卷积层如何必须看起来相同?LeCun 的“全连接表”是什么意思?

我想要获得等效的 CNN,它必须具有完全相同数量的参数。上面的 MLP 有23+2=8参数。

4个回答

你的例子

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

n x n卷积应用于具有k特征图的层,需要你有一个 shape 的内核[n,n,k]因此,您的卷积核1x1具有 shape [1, 1, 3]您需要2这些内核(或过滤器)来生成2输出特征图。请注意:1×1卷积真的是 1×1×number of channels of the input卷积。最后一个很少被提及。

事实上,如果您选择内核和偏差:

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

然后,conv 层将计算 f(x)=ReLU((w1xw2x)+(b1b2))xR3.

真实代码中的转换

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

转换后的卷积层被引入函数中_fc_layer(第 145 行)。它们具有7x7FC6 的内核大小(这是最大的,因为pool5VGG 输出一个形状为 .Layer 的特征图,[7,7, 512]并被FC7实现FC81x1卷积。

《全连接表》

他可能指的是与输入特征图具有相同维度的过滤器/内核。在这两种情况下(代码和您的示例),空间维度在某种意义上都是最大的,即过滤器的空间维度与输入的空间维度相同。

全连接层(用于输入大小 nn 结束 i 频道,以及 m 输出神经元)不等价于 1x1 卷积层,而是等价于 nXn 卷积层(即一个大内核,与输入大小相同 - 无填充),滤波器数量等于 FC 输出/隐藏层(即 m 过滤器)

如您所问,它具有与 FCN 相同数量的参数,即 nnim (加上偏见):

FCN: nni (每个输入层的权重=输入渠道) m (乘以输出/隐藏层宽度)

美国有线电视新闻网: nn (每个内核) i (每个输入通道的内核) m (过滤器数量)

来源

等效内核只是具有输入具有的任何形状,并计算张量点积。(我使用“形状”这个词,因为“大小”似乎有些混淆,这通常忽略了通道/深度维度)。不涉及“跨输入滑动内核”,因为内核尽可能大。引用斯坦福 CS 231n 课程笔记

任何 FC 层都可以转换为 CONV 层。例如,一个 K=4096 的 FC 层正在查看一些大小为 7×7×512 的输入量,可以等效地表示为一个 F=7,P=0,S=1,K=4096,F 的 CONV 层=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”在这里意味着每个卷积核的形状为 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 之间的完全连接。

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

线性层和 1x1 卷积是一回事。我花了一段时间才明白没有“全连接层”这样的东西——它只是将空间维度扁平化为一维巨型张量。展平导致所有空间位置上的每个元素都呈现为单独的特征图/通道/维度(无论您想如何称呼它)。因此,当我们在展平张量上应用线性层时,我们会得到一个完全连接的操作,这显然与 1x1 卷积不同。

1x1卷积只是输入特征图的加权求和,在 OP 的问题中,3. O[0] =j=01X[j]W0[j]+b[0]. 同样,O[1] =j=01X[j]W1[j]+b[1] 和 O[2] = j=01X[j]W2[j]+b[2].

上述 3 个方程展开为 O=W2×3X3×1+b2×1.

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