深度学习:核心技术、工具与案例解析
上QQ阅读APP看书,第一时间看更新

2.2 CNN

卷积神经网络(CNN)是深度学习技术中重要的网络结构之一,其在计算机视觉问题中的应用取得了非常好的效果,并且在ImageNet、Coco等竞赛数据集上取得了不俗的成绩。通过深度学习CNN的处理方式,我们可以发现CNN相比于图像处理算法的优点在于,CNN可以直接输入原始图像,这就避免了对图像复杂的前期预处理与特征工程。同时CNN相较于传统的神经网络全连接的方式,规避了产生的参数量过大的问题,CNN可以通过局部连接、权值共享等方法进行优化,提升计算速度并节省空间占用。

例如,CNN处理图像识别这个典型的问题,图片被识别不仅仅取决于图片本身,还取决于图片是如何被观察也就是如何进行特征的提取。CNN的设计初衷也是来源于人类对视觉信息的识别过程。例如,人脸识别中经过层层的卷积之后,所能够学习和提取的特征形状、概念也变得越来越抽象和复杂,CNN会尽可能地寻找最能解释训练数据的特征提取方式。

CNN图像处理的过程就是在进行信息抽取,巨大的网络可以逐层进行抽取并不断获取关键的图像特征,同时整个过程相比于传统机器学习来说是自动化的。

2.2.1 前馈网络解决图像存在的问题

如果训练前馈神经网络,使用物体位于中间的数据训练模型,则会造成模型只对中间位置的节点的权重进行调节。如果物体位于其他位置,则模型将会无法进行识别。

为了解决各个位置的物体识别问题,可以构建大量物体位于不同位置的数据,对模型进行训练,同时还需要增加网络层数,提高模型拟合能力。

那么是否有办法优化模型,减少扩充数据集等代价,将学习到的物体规律扩展到图像的其他位置,进而不同位置共享相同的权重?因为不管是左侧的物体也好,还是右侧相同的物体也罢,大家都是形状相同的物体。

深度学习CNN通过卷积层和池化层可以将不同位置的特征都提取出来,进而消除前馈神经网络对位置的依赖性,进而大大提升了模型的效率,减少构建数据集的开销。

接下来的几个章节将介绍卷积神经网络的基本组件。

2.2.2 卷积神经网络

如图2-7所示的是CNN的通用结构,CNN通用结构可能包含图中所示的一些组件,组件个数和排布方式由具体模型和试用数据及应用场景确定。CNN中可能包含卷积层、池化层、Flatten层、全连接层和输出层等网络结构,具体每种网络结构的作用,我们可以在后续的章节中进行详细介绍。首先我们需要了解图像的几个不变性,进而才能理解后续各个组件的设计初衷。

图2-7 CNN通用结构图2-7的来源:https://esmathworkscom/discovery/convolutional-neural-network.html。

2.2.3 图像的几个不变性

2.2.1节前馈神经网络解决图像的问题中,我们可以了解到位置不变性造成模型需要增加训练数据和提高拟合能力的问题,图像中其实还存在其他类型的不变性问题,如图2-8所示。而我们希望模型对同样的物体,不管是位置不同,分辨率不同,还是放置方向不同等情况都能将其准确地识别出来。

图2-8 图像数据不变性

我们希望所建立的网络能够尽可能地满足这些不变性特点。一般的思路是通过数据增强或优化模型结构来解决相应问题。

 

▼ 平移不变性(Translation Invariance)

解决:卷积层、权值共享、池化层。

 

▼ 旋转视角不变性(Rotation/Viewpoint Invariance)

解决:数据增强,对数据进行旋转Rotation。卷积层和池化层。

 

▼ 尺寸不变性(Size Invariance)

解决:Inception。

2.2.4 卷积

卷积层是CNN中的重要的组件,它不仅能够通过各种卷积核提取图像特征,还能够通过卷积优化传统全连接层的计算量。

1.基本结构

如果使用过图像处理软件Photoshop,就会发现其内部有一些滤镜,例如锐化、模糊、高反差识别等,它们会用一个矩阵来处理图像的每个小片,进而得到一个画面的转换,CNN的卷积计算正是通过类似于这种方式进行的特征提取。例如,PS中的低通滤镜通常可以用来降噪,高通滤镜可以得到图像的细微纹理。之所以通过这样的方式也是因为图像的特征大多存在于相邻像素之间,对应到CNN的卷积核就是,通过计算小区域内像素之间的关系进而来提取局部特征。

输入图像,在深度方向上由很多个slice组成,对于其中一个slice,可以对应很多神经元,神经元的权重参数(weight)表现为卷积核的形式,即一个方形的滤波器(filter)(如图2-9或图2-10中的3×3部分),这些神经元各自分别对应图像中的某一个局部区域(local region),用于提取该区域的特征。

图2-9 卷积

图2-10 卷积结果

如图2-9所示,图像为5×5像素,卷积核为3×3,滤波器不断作用于局部图像,将滤波器与局部图像进行乘法运算之后求和,生成输出的特征图(FeatureMap)的每一个元素。不断以一定的步长(stride)滑动卷积核最终形成图2-9中的结果,本图步长为1。

由图2-10可知,卷积作用完之后的输出图像大小发生了变化,如果想保持图像大小不变,那么可以使用padding使前后的图像尺寸保持相同,可以保持边界的信息。padding填充输入图像的边界,一般填充0(Zero Padding), padding的大小为P=(F-1)/2,其中F为filter的尺寸。

有些物体检测CNN的论文,提出了感受野(receptive field)的概念。

如图2-11所示,在卷积神经网络中,感受野的定义是卷积神经网络每一层输出的特征图上其像素点在原始图像上映射的区域大小。

图2-11 CNN及感受野

例如,Alexnet网络(CNN的经典网络之一)pool5输出的特征图上其像素在输入图像上有很大的感受野(195×195 pixels)和步长。

2.局部连接

我们可以通过图2-12对比全连接层和卷积层在计算开销上的差别。图2-12a是全连接层的计算方式,图2-12b是局部连接的计算方式。假设输入图像为1000×1000像素,而与之连接的隐藏层的神经元是106,那么计算一下则全连接会产生1000×1000×106=1012个权重参数,大量的参数将造成巨大的计算开销;如果使用卷积层中的局部连接方式,隐藏层的每个神经元只和图像中10×10的局部图像进行连接,那么权重参数将骤减为10×10×106= 108,对计算量有数量级的消减。

图2-12 卷积层与全连接层对比

3.多滤波器

不同的滤波器可以获取到不同的信息和特征。

基础形状:较大的形状都可以分解为细小的形状和部件,也就是小的形状可以逐级逐步组合成大的部件。比如图2-13中,由pixels可以构成edges,由edges可以构成object parts,由object parts可以构成object models。若将探测到细小图形的特征图作为新的输入,那么再次卷积后,则可以由此探测到“更大”的形状概念,这样逐层探测可以将局部小的形状信息卷积为大的形状信息。

图2-13 滤波器的作用

其他特征:图像颜色、对比度等特征对图像的识别也有一定影响。卷积层也可以设计相应的滤波器进行相应的特征提取。通过下面的图2-14可以看到,卷积过后的特征可以获取边缘、棱角、模糊等对识别有帮助的信息。

图2-14 几类滤波器及作用图片2-14来源:https://ujjwalkarn.me/2016/08/11/intuitive-explanation-convnets/。

图2-14展示了不同滤波器的作用。例如,有的滤波器可以进行边缘检测、锐化、边框模糊(Box Blur)、高斯模糊等。

因此使用多个不同的滤波器对同一张图片进行多次特征提取,可以获得不同的特征图。

4.权值共享

采用卷积的方式,可以减少一定参数,但是参数量依然很多。采用权值共享的方式可以进一步减少参数。例如,在第2节例子中,隐藏层的每一个神经元连接的是一个10×10的局部图像,因此有10×10个权值参数。将这10×10个权值参数共享给剩下的神经元,也就是说隐藏层中106个神经元的权值参数都是相同的,此时不管神经元数量为多少,权重参数均变为10×10个。

2.2.5 池化

通过卷积获得了特征之后,我们希望利用这些特征进行分类。理论上讲,人们可以利用提取到的所有特征去训练分类器,但这样做将面临着计算量的挑战。

为了解决这个问题,首先回忆一下,我们之所以决定使用卷积后的特征是因为图像区域有用的特征极有可能在另外一个区域也同样适用,这称为图像的静态性。

因此,可以对不同位置的特征进行聚合统计进而表示一个更大的图像。例如,人们可以计算图像某一个区域上的某个特定特征的平均值(或最大值)。聚合统计特征不仅具有低得多的维度(相比使用提取得到的所有特征),同时还会改善结果(不容易过拟合)。池化层的主要功能是下采样,却不会损坏识别结果。这意味着卷积后的特征图中有对于识别物体来说不必要的冗余信息。这种聚合的操作就称为池化(pooling),有时也称为平均池化或者最大池化,具体取决于计算池化的方法。

如图2-15所示的是使用最大池化(max pooling)操作的实例。max pooling的操作如图2-15所示,整个图片被不重叠地分割成若干个同样大小的小块(pooling size)。每个小块内只取最大的数字,一步步操作后即可获得特征图。

图2-15 池化层

综上所述,CNN引入局部连接、权值共享和池化层,也是出于图像平移不变性的考虑。因为有权值共享,即使同一形状的物体在不同位置也可以被等价识别,因此不需要对每个位置都设计自己的卷积滤波器进行学习。

2.2.6 Inception

对于相同的物体形状,可能由于图像分辨率等原因,在不同的图像中其大小可能不一样,为了消除尺寸对于识别结果的影响,研究人员设计了Inception的结构,如图2-16所示。尽管也有不同的版本,但是其动机都是一样的:消除尺寸对于识别结果的影响,一次性使用多个不同的滤波器大小来抓取多个范围不同的概念,并让网络自己选择所需要的特征。

图2-16 Inception实例

输入(可以是卷积完后的长方体输出作为该层的输入)进来后,通常我们选择直接使用像素信息(1×1卷积)传递到下一层,可以选择3×3卷积,也可以选择5×5卷积,还可以选择max pooling的方式处理刚被卷积后的特征图。但在实际的网络设计中,究竟该如何选择是需要大量的实验和经验的。

2.2.7 Flatten层和全连接层

当抓取到足以用来识别图片的特征之后,接下来的问题就是如何进行分类,通过Flatten层展平之前的特征图,并结合全连接层将结果映射到可分的空间。全连接层(Fully Connected Layers, FC)在整个卷积神经网络中起到了“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,那么全连接层起到的作用则是将学到的特征映射到样本标记空间。通常卷积网络的最后会将末端得到的长方体平摊(Flatten)成一个长长的向量,并送入全连接层配合输出层进行分类。

2.2.8 跳层连接

之前介绍的神经网络模型和深度学习模型,都是逐层逐步变换的,不允许跳层组合。但在现实中,比如说我们在判断一个物体的时候,很多时候我们并不是观察它的全部,或者提供给你的图片本身就是残缺的,这时我们可以通过跳层连接来获取组合信息以辅助判断。

例如我们判断一个人会靠其五官、着装、身形来综合判断其特征。即便图片本身是残缺的也可以很好地判断它是什么。

跳层连接允许不同层级之间的因素进行信息交互、综合判断。例如图2-17所示的DenseNet就是拥有这种特点的神经网络。

图2-17 DenseNet

2.2.9 经典CNN

上文介绍了卷积神经网络的基本概念,以及各个组件的作用和设计初衷。以下是经典的卷积神经网络结构,从中我们可以了解到整个CNN的发展趋势和进化方向。

 

▼ LeNet:较早的深度神经网络结构。

▼ AlexNet:相比LeNet,网络层次更深。其使用堆叠卷积层来进行特征提取,通常是一个卷积层之后连接一个Max Pooling层,形成网络结构。

▼ ZF Net:增加了中间卷积层的尺寸,使得第一层的Stride和滤波器尺寸更小。

▼ GoogLeNet:减少参数数量,最后一层使用Max Pooling层代替了全连接层,同时引入了Inception-v4模块的使用。

▼ VGGNet:只使用3×3卷积层和2×2 pooling层进行深度神经网络结构连接。

▼ ResNet:引入了跳层连接和Batch Normalization。

▼ DenseNet:将跳层连接应用于整个网络结构。

这些结构的发展趋势具体如下。

 

▼ 使用更小尺寸滤波器的卷积层和池化层。

▼ 去掉参数过多的全连接层。

▼ Inception。

整体设计利用图像不变性的先验知识在提高深度神经网络整体性能的同时可以节省计算量。满足新的不变性特点的神经网络,以及减少计算量的优化,是计算机视觉领域很重要的研究方向。

综上所述,卷积神经网络大致就是卷积层、池化层、激活函数、全连接层的组合。