卷积层在实践中通常是如何实现的?

人工智能 卷积神经网络 执行 卷积
2021-11-10 17:52:08

在较早的问题之后,我有兴趣了解内核的基础知识,Conv2d尤其是内核的应用、求和和传播方式。我明白那个:

  1. a 的kernel大小为WxH并且应用了多个内核(例如,S x W x H),其中S是内核的数量。
  2. 迭代网络输入时使用步幅或步长
  3. 通过添加到网络输入中可以使用或不使用填充。

理想情况下,我希望看到的要么是描述,要么是 python 示例(pytorchtensorflow),它是如何完成的、输出的维数是什么,以及我可能遗漏的任何操作(一些 YouTube 视频说内核是总结的)然后划分为一个新的唯一值,代表特征激活?)

1个回答

我不认为要理解卷积,您需要深入研究大型库的嵌套代码,因为代码很快变得非常难以理解和令人费解(ba dum tsss!)。开个玩笑,在 PyTorch 中,Conv2d是一个应用另一个低级函数conv2d的层,它是用 c++ 编写的。

幸运的是,来自 PyTorch 的人在文档中写了关于如何实现卷积的总体思路:

在此处输入图像描述

从这一段中,我们已经有了一些重要的信息,比如输入和输出维度。通道的数量应该很容易理解,如果我们有一张 RGB 图像,例如,通道是 3,每种颜色一个,所以它们只是代表不同特征的不同矩阵。

下一个重要元素是对互相关的引用,该函数通过内核 k 应用于我们的输入图像。为什么是互相关?因为它几乎与卷积相同,所以您可以看到比较它们的公式:

在此处输入图像描述

唯一的区别在于宽度索引的实现方式,这导致操作从卷积的输入矩阵的右下角开始,从互相关的输入图像的左上角开始(图中的圆圈)上图中的方块)。由于在大多数编程语言中,矩阵索引从左上角开始,因此互相关是最常见的实现选择。

但是这些公式在实践中是如何工作的呢?这是深度学习第 9 章(Goodfellow、Bengio、Courville)拍摄的另一张图片,强烈建议您阅读。

在此处输入图像描述

基本上,从输入矩阵中,提取具有相同维度的内核的子矩阵,然后将子矩阵和内核相乘并将所有结果相加,以产生单个输出元素,该元素将形成一个“像素” ' 得到的特征图(输出矩阵)。

这是我制作的另一个假号码示例。我希望过滤器/内核的双重符号不会产生混淆,我实际上发现有时它是不一致的(在我链接的章节中,他们甚至根本不使用过滤器)。在实践中,它们实际上意味着同样的事情,我通常将内核称为与输入相乘的实际矩阵,并且使用过滤器我指的是输入图像上的滑动窗口(当然,它必须具有与内核相同的维度)。

在此处输入图像描述

最后,当您应用填充时,过滤器实际上也可以移动到输入矩阵的“边缘”之外,在这种情况下,外面的所有元素都将被视为零。计算是完全一样的,但是由于分割步骤更多,输出矩阵的维度会更大。

在此处输入图像描述

请注意,对于多个输入通道,您可以执行 2d 卷积或 3d 卷积,差异取决于滤波器尺寸,在 2d 卷积的情况下,它将是一个正方形,而在 3d 卷积中,它将是一个立方体。这意味着对于 RGB 图像,2d 卷积将独立处理每个颜色层,将来自每个通道的信息与池化等进一步计算混合(平均每种颜色的结果特征图或选择每个像素的特征图中的最大值,等等..),而 3d 卷积将在卷积期间将颜色层混合在一起,这要归功于 3d 内核,它将来自不同层的元素相加。