卷积神经网络
通过前面几篇文章,我们对神经网络有了一个基本的认识。本文,我们来介绍一下神经网络在图像与视觉领域的应用——卷积神经网络(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,可以有效抑制过拟合
总结
本文我们主要介绍了卷积神经网络的基本概念及其工作原理,相比于全连接神经网络,卷积神经网络主要增加了卷积层和池化层,其中卷积层用于提取图像数据的空间特征,池化层用于压缩数据,提高鲁棒性,最后使用全连接层进行分类结果的计算和输出。