卷积神经网络

通过前面几篇文章,我们对神经网络有了一个基本的认识。本文,我们来介绍一下神经网络在图像与视觉领域的应用——卷积神经网络(Conventional Neural Network,简称 CNN)。

视觉认知原理

在深度学习的发展过程中,广泛应用了大脑认知原理,尤其是视觉认知原理,这里我们来简单了解一下视觉认知原理。

1981 年的诺贝尔医学奖,颁发给了 David Hubel 和 TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是发现了视觉系统的信息处理,可视皮层是分级的。整体而言,人类的视觉认知原理大体分为以下几个步骤:

  • 通过瞳孔摄入原始的像素信号
  • 通过大脑皮层的细胞发现边缘和方向
  • 对边缘和方向进行组合,从而完成形状判定
  • 对形状进行高级视觉抽象,从而完成分类认知

人类视觉认知是一个分层递进的过程:提取边缘特征,抽象高级特征,组合整体图像,最终完成分类。下图所示是对于不同物体的视觉认知过程。

全连接层的局限性

理论上,我们可以使用一个由全连接层组成的神经网络来进行图像识别,事实上,在 初识人工神经网络(2)——代码实现 一文中,我们也是这么做的。

然而,对于复杂图像,全连接神经网络的表现并不好,根本原因在于 全连接层忽略了数据的形状。图像是 3 维形状(宽、高、RGB 通道),空间上邻近的像素会有相似的值,RGB 各通道之间也有关联性。而全连接层会忽略形状,将数据作为一维数据进行处理,因此无法利用数据的空间关联信息。

因此,为了提取图像数据的空间关联信息,于是诞生了卷积神经网络。

卷积神经网络

我们首先来看一下全连接神经网络和卷积神经网络的整体结构,如下所示。两者的主要区别在于:在输入端,CNN 络使用「卷积层 + ReLU + 池化层」的结构代替了「全连接层 + ReLU」的结构

整体而言,卷积神经网络的工作流程主要分为三个阶段,分别是:

  • 通过 卷积层(Convolution Layer)对图像进行特征提取,得到特征图;
  • 通过 池化层(Pooling Layer)对特征图进行降采样,压缩数据量;
  • 通过 全连接层(Affine Layer)对特征图进行分类,得到识别结果。

下面,我们分别介绍一下卷积层和池化层。

卷积层

《计算机图形学基础(4)——光栅化》 一文中,我们提到过卷积(Convolution)是实现滤波的主要数学工具和底层原理。滤波器的基本原理是 响应函数与输入信号进行卷积运算,因此滤波器也可以称为 卷积核

卷积神经网络的核心在于卷积层,卷积层则包含了大量滤波器,这些滤波器通过监督学习,自适应调整内部权重参数,从而能够更加准确地提取特征值。下图所示是一个图片应用不同滤波器的示例。

卷积运算

了解了滤波器的作用后,我们再来看一下滤波器的内部原理——卷积运算。如下所示,是一个卷积运算的例子。其中,输入大小是 \((4, 4)\),滤波器大小是 \((3, 3)\),输出大小是 \((2, 2)\)

下图所示展示了卷积运算的执行顺序。对于输入数据,卷积运算以一定步幅滑动滤波器的窗口,同时将滤 波器元素和对应的输入元素相乘并求和,最终保存至对应的输出位置,即可得到卷积运算结果。

全连接神经网络中,除了权重参数,还存在偏置。同样,在 CNN 中,也存在偏置,下图所示展示了包含偏置的卷积运算。

填充

前面,我们介绍了一个卷积运算的例子,其输入大小是 \((4, 4)\),滤波器大小是 \((3, 3)\),输出大小是 \((2, 2)\)。此时可以会发现输出结果的大小已经小于滤波器的大小,将无法继续执行卷积运算,那么该如何解决呢?我们可以使用 填充(Padding)来解决。

如下所示,我们对输入数据进行了幅度为 1 的填充,输入大小从 \((4, 4)\) 变成了 \((6, 6)\),输出大小从 \((2, 2)\) 变成了 \((6, 6)\)。由此可见,填充可以调整卷积运算的输出大小,填充增大,输出大小增大。

步幅

除了填充,我们还可以通过 步幅(Stride)来控制输出大小。下图所示,我们设置步幅为 2,滤波器每次滑动的间隔则为 2。整体而言,步幅增大,输出大小减小。

滤波器通道

上述例子中的输入是 2 维数据,但是图像是 3 维数据(宽、高、RGB 通道),对此,我们也可以为滤波器增加一个维度——通道。

下图所示,纵深方向为通道方向,输入数据的通道数为 3,与此对应,滤波器的通道数也为 3。每个通道的输入数据与对应通道的滤波器进行卷积运算,最后对所有通道的输出进行求和,从而得到输出结果。

此时,我们可以将输入数据抽象为 3 个维度,分别是通道数 \(C\)、高度 \(H\),宽度 \(W\),整体使用 \((C, H, W)\) 表示;滤波器也样,高度 \(FH\)(Filter Height)、宽度 \(W\)(Filter Width),通道数为 \(C\),整体使用 \((C, FH, FW)\) 表示;输出大小为 \((1, OH, OW)\)

滤波器数量

上述卷积运算一次只能输出一张特征图(Feature Map),如果希望一次输出多张特征图,我们可以增加滤波器的数量,如下所示。

池化层

如果卷积层的输入数据非常大,那么输出特征图的数据量也会非常大。为了降低后续处理的数据量,以及提高鲁棒性、防止过拟合,卷积神经网络会在卷积层之后增加一个池化层。

池化的本质是对输出特征图进行局部采样,也称降采样(Downsampling)。下图所示,是对一个输出特征图进行池化运算的示意图,其中使用的池化层为 Max 池化层,即计算局部区域中的最大值。

对于多通道的场景,池化层将同时处理多个通道的数据,并进行池化运算,如下所示展示的是多通道池化运算顺序。

全连接层

经过多层「卷积 + ReLU + 池化」的运算,神经网络能够提炼出经过高度简化、高度抽象的特征,这些特征总结了图像的空间信息。最后,为了对图像进行分类识别,我们需要使用全连接层来进行处理。

如下图所示,全连接层会将池化层的输出结果进行降维输入,在监督学习的过程中,除了调整卷积层中的滤波器权重参数,也会调整全连接的权重参数,最终输出准确的分类结果。

经典 CNN

时至今日,业界已经出现了各种卷积神经网络。这里,我们介绍其中两个经典的网络,一个是 1998 年首次被提出的 CNN——LeNet;另一个是在深度学习受到关注的 2012 年提出的 AlextNet。

LeNet

LeNet 在 1998 年提出时是用于解决手写数字识别的问题。如下所示,它包含连续的卷积层和子采样层,最后通过全连接层输出结果。与现在的 CNN 相比,LeNet 有几个不同点:

  • LeNet 使用 sigmoid 函数作为激活函数,而现在的 CNN 主要使用 ReLU 函数作为激活函数
  • Lext 采用子采样(Subsampling)进行数据压缩,而现在的 CNN 主要使用池化层(Max 池化)进行数据压缩

AlexNet

AlexNet 是图领奖获得者 Geoffrey Hinton 和他的学生 Alex Krizhevsky 在 2012 年提出的,AlexNet 提出后引发了深度学习的浪潮,不过它的网络结构和 LeNet 并没有本质的区别。

AlexNet 和 LeNet 之间的主要区别在于:

  • AlexNet 采用了 ReLU 作为激活函数
  • AlexNet 采用了局部正规化的 LRN(Local Response Normalization)层
  • AlexNet 采用了 Drouput,可以有效抑制过拟合

总结

本文我们主要介绍了卷积神经网络的基本概念及其工作原理,相比于全连接神经网络,卷积神经网络主要增加了卷积层和池化层,其中卷积层用于提取图像数据的空间特征,池化层用于压缩数据,提高鲁棒性,最后使用全连接层进行分类结果的计算和输出。

参考

  1. 《深度学习入门:基于Python的理论与实现》
  2. Convolutional Neural Networks (CNNs / ConvNets)
  3. 卷积神经网络和深度神经网络的区别是什么?
  4. 卷积神经网络-CNN
  5. Convolutional Neural Network
  6. Convolutional Neural Networks - Basics
  7. 卷积