社区计算机视觉课程文档
卷积神经网络简介
并获得增强的文档体验
开始使用
卷积神经网络简介
在上一单元中,我们学习了视觉、图像和计算机视觉的基础知识。我们还探索了视觉特征作为借助计算机分析图像的关键部分。
我们讨论的方法现在通常被称为“经典”计算机视觉。虽然在许多小型和受限的数据集和设置中运行良好,但经典方法在处理大规模真实世界数据集时会暴露出其局限性。
在本单元中,我们将学习卷积神经网络,这是计算机视觉在规模和性能方面向前迈出的重要一步。
卷积:基本概念
卷积是一种用于从数据中提取特征的操作。数据可以是 1D、2D 或 3D。我们将通过一个具体的例子来解释这个操作。现在你只需要知道,这个操作只是简单地取一个由数字组成的矩阵,在数据中移动它,并计算数据与该矩阵之间的乘积之和。这个矩阵被称为核或滤波器。你可能会说,“这与特征提取有什么关系,我该如何应用它呢?”别慌!我们正在讲到。
为了阐明直觉,我们来看一个例子。我们有这个一维数据,并将其可视化。可视化将有助于理解卷积操作的效果。

我们有这个核 [-1, 1]。我们将从最左边的元素开始,放置核,将重叠的数字相乘,然后求和。核有中心;它是其中一个元素。在这里,我们将中心选为 1(右边的元素)。我们在这里选择中心为 1,假设左边有一个虚构的零,这被称为填充,你稍后会看到。现在,核的中心必须接触每个元素,所以为了方便起见,我们在元素的左边放置一个零。如果我们不填充,我就必须用 -1 乘以最左边的元素,而 1 不会接触最左边的元素,所以我们应用填充。让我们看看它是什么样子。

我将最左边的元素(当前是填充)乘以 -1,将第一个元素(零)乘以 1,然后将它们相加,得到 0,并记录下来。现在,我们将核移动一个位置,并重复相同的操作。再次记录下来,这种移动称为步幅,通常通过将核移动一个像素来完成。你也可以移动更多像素。结果(卷积数据)目前是一个数组 [0, 0]。

我们将重复此操作,直到核的右侧元素接触到每个元素,从而得到以下结果。

你注意到什么了吗?该滤波器给出了数据的变化率(导数!)。这是我们可以从数据中提取的一个特征。让我们将其可视化。

卷积数据(卷积的结果)称为特征图。这很有道理,因为它显示了我们可以提取的特征、与数据相关的特性以及变化率。
这正是边缘检测滤波器所做的工作!让我们在二维数据中看看它。这次,我们的核将有所不同。它将是一个 3x3 的核(只是为了让你知道它也可以是 2x2)。

这个滤波器其实很有名,但我们现在不告诉你它的名字 :)。之前的滤波器是 [-1 1]。而这个是 [-1 0 1]。它只是 3x3 的形状,没有什么不同,它显示了水平轴上的增量和减量。让我们看一个例子并应用卷积。下面是我们的二维数据。

把这看作一张图片,我们想提取水平变化。现在,滤波器的中心必须接触到每个像素,所以我们对图片进行填充。

特征图将与原始数据大小相同。卷积的结果将被写入到核中心在原始矩阵中接触到的相同位置,这意味着对于这个,它将接触最左边和顶部位置。

如果我们持续应用卷积,我们将得到以下特征图。

这向我们展示了水平变化(边缘)。这个滤波器实际上叫做 Prewitt 滤波器。

你可以翻转 Prewitt 滤波器 以获取垂直方向的变化。Sobel 滤波器 是另一个著名的边缘检测滤波器。
卷积神经网络
好的,但这与深度学习有什么关系呢?嗯,暴力破解滤波器来提取特征对每张图片都不适用。想象一下,如果我们可以以某种方式找到最优滤波器来提取重要信息甚至检测图像中的物体。这就是卷积神经网络发挥作用的地方。我们用各种滤波器对图像进行卷积,特征图中的这些像素最终将成为我们要优化的参数,最终,我们将为我们的问题找到最佳滤波器。
其思想是,我们将使用滤波器来提取信息。我们将随机初始化多个滤波器,创建我们的特征图,将它们输入分类器,然后进行反向传播。在深入研究之前,我想向你介绍我们称之为“池化”的东西。
如上图所示,有许多像素显示特征图中的变化。要知道存在边缘,我们只需要看到存在变化(边缘、拐角,任何东西),仅此而已。

在上面的例子中,我们只需要获得其中一个就足够了。这样,我们将存储更少的参数,并且仍然拥有特征。这种获取特征图中最重要的元素的操作称为池化。通过池化,我们失去了边缘存在的精确像素位置,但我们存储了更少的参数。此外,这样,我们的特征提取机制对微小变化将更具鲁棒性,例如,我们只需要知道图片中有两只眼睛、一个鼻子和一张嘴,就知道它是一张脸,这些元素之间的距离和这些元素的大小在不同的脸之间往往会发生变化,而池化使模型能够对这些变化更具鲁棒性。池化的另一个好处是它帮助我们处理不同的输入大小。下面是最大池化操作,每四个像素中,我们取最大的像素。池化有多种类型,例如平均池化、加权池化或 L2 池化。
让我们构建一个简单的 CNN 架构。我们将使用 Keras 示例(为了说明),我们将引导你了解正在发生的事情。下面是我们的模型(再次,不要惊慌,我们将引导你了解正在发生的事情)。
如果你不知道 Keras Sequential API 在做什么,它就像乐高积木一样堆叠层并连接它们。每层都有不同的超参数,Conv2D 层接受卷积滤波器数量、核大小和激活函数作为参数,而 MaxPooling2D 接受池化大小,全连接层接受输出单元数量(再次,不要惊慌)。
大多数卷积网络实现为了让核以图像处理的方式接触每个像素而不进行填充。零填充的假设是,我们可能在边界处有特征,并且它增加了计算的复杂性。这就是为什么你看到第一个输入大小是 (26,26),我们在边界处丢失了信息。
model = keras.Sequential(
[
keras.Input(shape=input_shape),
layers.Conv2D(32, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Conv2D(64, kernel_size=(3, 3), activation="relu"),
layers.MaxPooling2D(pool_size=(2, 2)),
layers.Flatten(),
layers.Dropout(0.5),
layers.Dense(num_classes, activation="softmax"),
]
)
model.summary()
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) (None, 26, 26, 32) 320
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 13, 13, 32) 0
_________________________________________________________________
conv2d_1 (Conv2D) (None, 11, 11, 64) 18496
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 5, 5, 64) 0
_________________________________________________________________
flatten (Flatten) (None, 1600) 0
_________________________________________________________________
dropout (Dropout) (None, 1600) 0
_________________________________________________________________
dense (Dense) (None, 10) 16010
=================================================================
Total params: 34,826
Trainable params: 34,826
Non-trainable params: 0
_________________________________________________________________
卷积神经网络从输入层和卷积层开始。Keras Conv2D 层接受核的数量和核的大小作为参数。发生的事情如下图所示。在这里,我们将图像与 32 个核进行卷积,最终得到 32 个特征图,每个特征图的大小与图像相同。

在卷积层之后,我们放置一个最大池化层,以减少存储的参数数量,并使模型对变化具有鲁棒性,如上所述。这将减少计算的参数数量。


卷积神经网络中的反向传播理论
反向传播在这里如何工作?我们想要优化最佳的核值,所以它们就是我们的权重。最后,我们期望分类器找出像素值、核和类别之间的关系。因此,我们有一个非常长的展平数组,其中包含经过池化和激活的像素元素,这些元素与初始权重(核元素)进行卷积。我们更新这些权重,以便回答“我应该应用哪些核来区分猫和狗的照片?”这个问题。训练 CNN 的目的是找出最佳核,而这些核是通过反向传播找到的。在 CNN 之前,人们会尝试在图像上尝试很多滤波器来自己提取特征,而大多数通用滤波器(如我们上面看到的,例如 Prewitt 或 Sobel)不一定适用于所有图像,因为即使在同一数据集中,图像也可能非常不同。这就是为什么 CNN 优于传统的图像处理技术。
当我们使用卷积神经网络时,在存储方面有几个优点。
参数共享
在卷积神经网络中,我们对所有像素、所有通道和所有图像使用相同的滤波器进行卷积,这比使用密集神经网络遍历图像更有效,从而在存储参数方面具有优势。这被称为“权重绑定”,这些权重被称为“绑定权重”。这也在自动编码器中出现。
稀疏交互
在密集连接的神经网络中,我们一次性输入所有数据——由于图像有成百上千个像素,这非常耗费资源——而在卷积神经网络中,我们使用较小的核来提取特征。这称为稀疏交互,它有助于我们使用更少的内存。
< > 在 GitHub 上更新