如何将全连接层转换为卷积层?

机器算法验证 机器学习 神经网络 深度学习 卷积神经网络 卷积
2022-03-26 21:14:52

使用全连接网络 (FCN) 时,即使在阅读http://cs231n.github.io/convolutional-networks/#convert之后,我仍然无法理解全连接 (FC) 层到卷积层转换的实际工作原理

在他们的解释中,据说: 在此处输入图像描述

在这个例子中,据我了解,转换后的 CONV 层应该有形状(7,7,512),意思是(宽度,高度,特征尺寸)。我们有 4096 个过滤器。每个滤波器的空间大小的输出可以计算为 (7-7+0)/1 + 1 = 1。因此我们有一个 1x1x4096 的向量作为输出。

尽管转换后的层可以为我们提供相同大小的输出,但我们如何确保它们在功能上确实是等效的?在文章的后面部分提到,我们需要将 FC 层的权重矩阵重塑为 CONV 层过滤器。但我仍然对如何实际实现它感到困惑。

欢迎任何解释或链接到其他学习资源。

2个回答

受@dk14 回答的启发,现在我对这个问题有了更清晰的认识,尽管我并不完全同意他的回答。我希望在网上发布我的更多确认。

在一个普通情况下,原始 AlexNet 的输入仍然是 (224,224,3),经过一系列的 Conv 层和池化,我们到达了最后一个 Conv 层。此时,图像的大小变为(7,7,512)。

在转换后的 Conv 层(从 ​​FC1 转换而来),我们总共有 4096 * (7,7,512) 个过滤器,为我们生成 (1,1,4096) 个向量。在第二个转换后的 Conv 层(从 ​​FC2 转换而来),我们有 4096 * (1,1,4096) 个滤波器,它们为我们提供了一个输出向量 (1,1,4096)。对我们来说非常重要的是要记住,在转换中,过滤器大小必须与输入体积大小相匹配。这就是我们在这里一一过滤的原因。类似地,最后一个转换的 Conv 层有 1000 * (1,1,4096) 个过滤器,将为我们提供 1000 个类的结果。

处理的总结在帖子中: http ://cs231n.github.io/convolutional-networks/#convert 。 在此处输入图像描述

在 FC1 中,原始矩阵大小应为 (7*7*512, 4096),这意味着 FC2 中的 4096 个神经元中的每一个都与 FC1 中的每个神经元相连。而转换后,矩阵大小变为 (7,7,512,4096),这意味着我们有 4096 (7,7,512) 个矩阵。这就像取出原始巨大矩阵的每一行,并相应地重塑它。

让我们从的概念开始。它实际上是什么意思:F=7P=0S=1

  • F=7:感受野大小设置为最大值(1D 为 7,2D 为 7x7),这意味着没有参数共享(因为只有一个感受野),这是 MLP 的默认值。如果 F 等于 1,则所有连接(来自上图)将始终具有相同的权重。

  • S=1: stride 等于 1,这意味着下一层的神经元不会被移除(见下图)。给定F=7如果我们有 stride = 2,下一层节点的数量会少两倍。 在此处输入图像描述 来源:http ://cs231n.github.io/convolutional-networks

  • P=0:没有零填充,因为我们不需要它用于完整的感受野(如上图所示,没有未覆盖的单元)。

这三个条件基本上保证了连接架构与规范 MLP 完全相同。


尝试回答有关重塑矩阵的问题:

Python 的 Numpy 库中的重塑示例:numpy.reshape

我的猜测是作者的意思是 FCN 通常有 1D 输出“向量”(来自每一层)而不是 2D 矩阵。假设 FC 网络的第一层返回 1x1x4096 输出矩阵,因为它不关心图像的尺寸 - 它将所有尺寸堆叠到一个向量中(将每一行放在另一个之上)。您可以猜测下一层的权重矩阵将具有相应的形状(4096x4096),它结合了所有可能的输出)。因此,当您将其转换为卷积感受野时 - 您可能必须将激活移动到 2D,因此您需要 64x64 激活,我猜,感受野的权重需要 64x64x4096 张量(因为S=1)。

文章中演示“重塑”的引述:

例如,如果 224x224 图像给出大小为 [7x7x512] 的体积 - 即减少 32,则通过转换后的架构转发大小为 384x384 的图像将给出大小为 [12x12x512] 的等效体积,因为 384/32 = 12。继续我们刚刚从 FC 层转换的接下来的 3 个 CONV 层,现在将给出大小为 [6x6x1000] 的最终体积,因为 (12 - 7)/1 + 1 = 6。请注意,而不是单个类别分数向量大小为 [1x1x1000],我们现在在 384x384 图像中获得整个 6x6 类分数数组

示例(用于某些层的激活):

1
2
3
4

|
|
\/

1 3
2 4

为了显示权重重塑(以适应 2D 图像),我必须将正方形绘制成立方体转换。不过网上有一些demo:

在此处输入图像描述 来源: http: //nuit-blanche.blogspot.com/2016/09/low-rank-tensor-networks-for.html

PS 但是,我对 AlexNet 示例有些困惑:似乎提到了F=1只是意味着跨不存在的维度(1x1)共享“完整”参数。否则,它不会完全等同于没有参数共享的 MLP - 但也许这就是暗示的(将小型 FC 网络扩展到大型 CNN)。


那么,有什么意义呢?

在较大图像中的许多空间位置上非常有效地“滑动”原始 ConvNet

基本上,它允许您将在小部分/图像上训练的 FC 网络扩展到更大的 CNN。所以在这种情况下,只有生成的 CNN 的小窗口最初会等同于原始 FCN。这种方法使您能够在大型网络之间共享参数(从小型网络学习),以节省计算资源并应用某种正则化(通过管理网络容量)。


Edit1 回应您的评论。

示例N=5(抱歉我懒得画7个神经元),F=5,S=2

在此处输入图像描述

所以你可以看到它S = 2甚至可以应用于最大尺寸的感受野,所以跨步可以在没有参数共享的情况下应用,因为它所做的只是去除神经元。

参数共享策略可能会有所不同。例如,你不能告诉我最后一个数字参数是否在神经元之间共享。