卷积神经网络(CNN)是近年来深度学习能取得突破发展的基石,他也被广泛应用于自然语言处理、推荐系统和语音识别等领域,本文按照一些经典神经网络出现的时间线,基于CIRFA10数据集,对算法的性能进行分析。本文首先将介绍一些卷积神经网络的基本概念,按照一些经典卷积神经网络出现的时间线,分别对LeNet5,AlexNet,VGG16,InceptionNet,ResNet等经典的神经网络模型进行学习并分析进步过程,在CIFAR10数据集分别实现这些神经网络模型并进行性能分析比较,分析模型改进的过程。总结出构建卷积网络的几点要素,了解什么操作能优化网络模型性能,从而得到符合自己预期的卷积网络模型。
卷积神经网络(Convolutional Neural Network,CNN)是一种前馈型的神经网络,其在大型图像处理方面有出色的表现,目前已经被大范围使用到图像分类、定位等领域中。相比于其他神经网络结构,卷积神经网络需要的参数相对较少,使其能够广泛应用。
卷积神经网络也是在传统人工神经网络的基础上发展起来的,它与 BP 神经网络有很大的相似之处,但也有很大的区别 ;BP 人工神经网络是以一维向量的方式进行输入,而卷积神经网络以二维矩阵格式数据进行输入,其网络的各层都是二维阵列的形式处理数据,这样的形式正好符合数字图像的二维矩阵格式,图像以二维矩阵输入正好保留了每个像素之间的相对位置信息,从而网络能够从输入图像中获取更多有用的的特征。卷积神经网络的结构和 BP 人工神经网络一样,是由一层层的结构组成,但是每一层的功能却不一样。卷积神经网络的层结构主要有 :输入层、卷积层、池化层(汇聚层、下采样层)、输出层等,其他的还可以有全连接层,归一化层之类的层结构。
本文的第一章将介绍卷积神经网络的一些基本概念:卷积层,池化层,DP层,激活函数,损失函数。第二部分介绍CIFAR10数据集。第三部分将介绍各种神经网络模型,搭建各种神经网络模型并对CIFAR10数据集进行分类,研究各种神经网络模型在CIFAR10数据集中的表现。第四部分对上述几种模型的结果进行总结分析。
卷积层(Convolutional layer),卷积神经网络中每层卷积层由若干卷积单元组成,每个卷积单元的参数都是通过反向传播算法最佳化得到的。卷积运算的目的是提取输入的不同特征,第一层卷积层可能只能提取一些低级的特征如边缘、线条和角等层级,更多层的网路能从低级特征中迭代提取更复杂的特征。卷积核实际就是一个数值矩阵,并且每个卷积核拥有一个常量偏置,所有矩阵里的元素加上偏置组成了该卷积层的权重,权重参与网络的迭代更新,常用的卷积核大小有 11、33、55、77 等。
局部感受野和权值共享是卷积操作的两个鲜明特点。局部感受野是指每次卷积操作只需要关心做卷积操作的那部分区域的颜色、轮廓、纹理等信息 ;局部感受野的大小就是卷积核卷积操作时的作用范围,这仅仅是对于一层卷积层而言,对于多层卷积网络,可由此逐层往回反馈,通过反复迭代可以计算出在原始输入图像中感受野大小,从而计算多层卷积层感受野大小与该层之前所有卷积层的卷积核大小和步长有关。权值共享是指卷积核在卷积操作中每个卷积核的值是不变的,除了每个迭代的权重更新,当然每个卷积核里的值是不一样的,则卷积核便不同,可以理解为每个卷积核提取的是一种特征,如有的提取的是图像的颜色特征、轮廓特征等。
池化(Pooling)是卷积神经网络中另一个重要的概念,它实际上是一种形式的降采样。有多种不同形式的非线性池化函数,而其中“最大池化(Max pooling)”是最为常见的。它是将输入的图像划分为若干个矩形区域,对每个子区域输出最大值。直觉上,这种机制能够有效地原因在于,在发现一个特征之后,它的精确位置远不及它和其他特征的相对位置的关系重要。池化层会不断地减小数据的空间大小,因此参数的数量和计算量也会下降,这在一定程度上也控制了过拟合。通常来说,CNN的卷积层之间都会周期性地插入池化层。
池化层通常会分别作用于每个输入的特征并减小其大小。最常用形式的池化层是每隔2个元素从图像划分出的区块,然后对每个区块中的4个数取最会减少75%的数据量。
Dropout 的概念在本质上非常简单。Dropout 层将[丢弃(drop out)]该层中一个随机的激活参数集,即在前向通过(forward pass)中将这些激活参数集设置为 0,简单如斯。既然如此,这些简单而且似乎不必要且有些反常的过程的好处是什么?在某种程度上,这种机制强制网络变得更加冗余。这里的意思是:该网络将能够为特定的样本提供合适的分类或输出,即使一些激活参数被丢弃。此机制将保证神经网络不会对训练样本「过于匹配」,这将帮助缓解过拟合问题。另外,Dropout 层只能在训练中使用,而不能用于测试过程。
激活函数的作用是选择性的对神经元节点进行特征激活或抑制,能对有用的目标特征进行增强激活,对无用的背景特征进行抑制减弱,从而使得卷积神经网络可以解决非线性问题。网络模型中若不加入非线性激活函数,网络模型相当于变成了线性表达,从而网络的表达能力也不好,如果使用非线性激活函数,网络模型就具有特征空间的非线性映射能力。另外激活函数还能构建稀疏矩阵,使网络的输出具有稀疏性,稀疏性可以去除数据的冗余,最大可能的保留数据特征,所以每层带有激活函数的输出都是用大多数值为 0 的稀疏矩阵来表示。
激活函数必须具备一些基本的特性:
1)单调性:单调的激活函数保证了单层网络模型具有凸函数性能;
2)可微性:使用误差梯度来对模型权重进行微调更新。激活函数可以保证每个神经元节点的输出值在一个固定范围之内,限定了输出值的范围可以使得误差梯度更加稳定的更新网络权重,使得网络模型的性能更加优良;当激活函数的输出值不受限定时,模型的训练会更加高效,但是在这种情况下需要更小的学习率。
卷积神经网络经常使用的激活函数有好几种:sigmoid函数、tanh函数、relu函数、leakyrelu函数、prelu函数等,每种激活函数使用的方法大致相同,但是不同的激活函数带来的效果却有差异,目前卷积神经网络中用得最多的还是relu函数,sigmoid 函数在传统的 BP 神经网络中用得比较多。
损失函数亦叫做代价函数,在机器学习的任务中,所有算法都有一个目标函数,算法的原理就是对这个目标函数进行优化,优化目标函数的方向是取其最大值或者最小值,当目标函数在约束条件下最小化时就是损失函数。在卷积神经网络中损失函数用来驱动网络训练,使网络权重得到更新。
CIFAR-10数据集由10个类的60000个32x32彩色图像组成,每个类有6000个图像。有50000个训练图像和10000个测试图像。
数据集分为五个训练批次和一个测试批次,每个批次有10000个图像。测试批次包含来自每个类别的恰好1000个随机选择的图像。训练批次以随机顺序包含剩余图像,但一些训练批次可能包含来自一个类别的图像比另一个更多。总体来说,五个训练集之和包含来自每个类的正好5000张图像。
以下是数据集中的类,以及来自每个类的10个随机图像:
这些类完全相互排斥。汽车和卡车之间没有重叠。“汽车”包括轿车,SUV,这类东西。“卡车”只包括大卡车,都不包括皮卡车。
最早的也最具有代表性的卷积神经网络模型是 LeNet5网络模型,诞生于1998年,这是一个浅层网络模型,由两个卷积层、两个池化层、一个全连接层组成,这个模型是卷积神经网络在实际中的第一个应用,应用于银行支票上手写数字的识别,当时取得了非常好的效果,这也是卷积神经网络的开山之作。
LeNet5分为卷积层块和全连接层块两个部分。下面我们分别介绍这两个模块。
卷积层块里的基本单位是卷积层后接最大池化层:卷积层用来识别图像里的空间模式,如线条和物体局部,之后的最大池化层则用来降低卷积层对位置的敏感性。卷积层块由两个这样的基本单位重复堆叠构成。在卷积层块中,每个卷积层都使用 5×5 的窗口,并在输出上使用sigmoid激活函数。第一个卷积层输出通道数为6,第二个卷积层输出通道数则增加到16。这是因为第二个卷积层比第一个卷积层的输入的高和宽要小,所以增加输出通道使两个卷积层的参数尺寸类似。卷积层块的两个最大池化层的窗口形状均为 2×2 ,且步幅为2。由于池化窗口与步幅形状相同,池化窗口在输入上每次滑动所覆盖的区域互不重叠。
卷积层块的输出形状为(批量大小, 通道, 高, 宽)。当卷积层块的输出传入全连接层块时,全连接层块会将小批量中每个样本变平(flatten)。也就是说,全连接层的输入形状将变成二维,其中第一维是小批量中的样本,第二维是每个样本变平后的向量表示,且向量长度为通道、高和宽的乘积。全连接层块含3个全连接层。它们的输出个数分别是120、84和10,其中10为输出的类别个数。
Lenet5网络的模型架构如下图所示:
在LeNet提出后的将近20年里,神经网络一度被其他机器学习方法超越,如支持向量机。虽然LeNet可以在早期的小数据集上取得好的成绩,但是在更大的真实数据集上的表现并不尽如人意。一方面,神经网络计算复杂。虽然20世纪90年代也有过一些针对神经网络的加速硬件,但并没有像之后GPU那样大量普及。因此,训练一个多通道、多层和有大量参数的卷积神经网络在当年很难完成。另一方面,当年研究者还没有大量深入研究参数初始化和非凸优化算法等诸多领域,导致复杂的神经网络的训练通常较困难。
2012年,AlexNet横空出世。这个模型的名字来源于论文第一作者的姓名Alex Krizhevsky。AlexNet使用了8层卷积神经网络,并以很大的优势赢得了ImageNet 2012图像识别挑战赛。它首次证明了学习到的特征可以超越手工设计的特征,从而一举打破计算机视觉研究的前状。
AlexNet与LeNet的设计理念非常相似,但也有显著的区别。
第一,与相对较小的LeNet相比,AlexNet包含8层变换,其中有5层卷积和2层全连接隐藏层,以及1个全连接输出层。下面我们来详细描述这些层的设计。AlexNet第一层中的卷积窗口形状是11×11。因为ImageNet中绝大多数图像的高和宽均比MNIST图像的高和宽大10倍以上,ImageNet图像的物体占用更多的像素,所以需要更大的卷积窗口来捕获物体。第二层中的卷积窗口形状减小到5×5,之后全采用3×3。此外,第一、第二和第五个卷积层之后都使用了窗口形状为3×3、步幅为2的最大池化层。而且,AlexNet使用的卷积通道数也大于LeNet中的卷积通道数数十倍。紧接着最后一个卷积层的是两个输出个数为4096的全连接层。这两个巨大的全连接层带来将近1 GB的模型参数。由于早期显存的限制,最早的AlexNet使用双数据流的设计使一块GPU只需要处理一半模型。幸运的是,显存在过去几年得到了长足的发展,因此通常我们不再需要这样的特别设计了。
第二,AlexNet将sigmoid激活函数改成了更加简单的relu激活函数。一方面,relu激活函数的计算更简单,例如它并没有sigmoid激活函数中的求幂运算。另一方面,relu激活函数在不同的参数初始化方法下使模型更容易训练。这是由于当sigmoid激活函数输出极接近0或1时,这些区域的梯度几乎为0,从而造成反向传播无法继续更新部分模型参数;而relu激活函数在正区间的梯度恒为1。因此,若模型参数初始化不当,sigmoid函数可能在正区间得到几乎为0的梯度,从而令模型无法得到有效训练。
第三,AlexNet通过Dropout来控制全连接层的模型复杂度。而LeNet并没有使用Drop。
第四,AlexNet引入了大量的图像增广,如翻转、裁剪和颜色变化,从而进一步扩大数据集来缓解过拟合。
AlexNet8网络模型的模型架构如下图所示:
VGG模型是2014年ILSVRC竞赛的第二名,第一名是GoogLeNet。但是VGG模型在多个迁移学习任务中的表现要优于GoogLeNet。而且,从图像中提取CNN特征,VGG模型是首选算法。它的缺点在于,参数量有140M之多,需要更大的存储空间。但是这个模型很有研究价值。
VGG网络模型的特点是:
1)小卷积核。作者将卷积核全部替换为3x3(极少用了1x1);
2)小池化核。相比AlexNet的3x3的池化核,VGG全部为2x2的池化核;
3)层数更深特征图更宽。基于前两点外,由于卷积核专注于扩大通道数、池化专注于缩小宽和高,使得模型架构上更深更宽的同时,计算量的增加放缓;
4)全连接转卷积。网络测试阶段将训练阶段的三个全连接替换为三个卷积,测试重用训练时的参数,使得测试得到的全卷积网络因为没有全连接的限制,因而可以接收任意宽或高为的输入。
InceptionNet模型是2014年ILSVRC竞第一名,引入了inception结构块,该网络的特点为:
1)在同一层网络内内使用不同尺寸的卷积核,提高了模型感知力。
2)使用了批标准化,环节梯度消失。
其中,Inception的结构如下图所示:
由上图可以看出,Inception块里有4条并行的线路。前3条线路使用窗口大小分别是1×1、3×3和5×5的卷积层来抽取不同空间尺寸下的信息,其中中间2个线路会对输入先做1×1卷积来减少输入通道数,以降低模型复杂度。第四条线路则使用3×3最大池化层,后接1×1卷积层来改变通道数。4条线路都使用了合适的填充来使输入与输出的高和宽一致。最后我们将每条线路的输出在通道维上连结,并输入接下来的层中去。
下面是用Inception块搭建起来的InceptionNet示意图:
ResNet诞生于2015年,是当年ImageNet竞赛的冠军,引入了残差块的概念,沿用了VGG全 3×3 卷积层的设计。残差块里首先有2个有相同输出通道数的 3×3 卷积层。每个卷积层后接一个批量归一化层和relu激活函数。然后我们将输入跳过这2个卷积运算后直接加在最后的relu激活函数前。这样的设计要求2个卷积层的输出与输入形状一样,从而可以相加。如果想改变通道数,就需要引入一个额外的 1×1 卷积层来将输入变换成需要的形状后再做相加运算。
残差块结构如图所示:
ResNet使用4个由残差块组成模块,每个模块使用若干个同样输出通道数的残差块。第一个模块的通道数同输入通道数一致。由于之前已经使用了步幅为2的最大池化层,所以无须减小高和宽。之后的每个模块在第一个残差块里将上一个模块的通道数翻倍,并将高和宽减半。
ResNet提出了层间残差跳连,引入了前方信息,环节梯度消失,是神经网络层数增加成为了可能。
ResNet的模型架构如下图所示
上述五种神经网络按照时间顺序可如下排列:
LeNet是卷积网络的开篇之作,共享了卷积核,减少了网络参数。
AlexNet使用了relu激活函数,提升了训练速度;使用了Dropout,缓解了过拟合。
VGGNet使用了小尺寸卷积核减小参数,网络结构规整,适合并行加速。
InceptionNet在一层中使用了不同尺寸的卷积核,提升了感知力;使用批标准化,缓解梯度消失。
ResNet提出了层间残差跳连,引入前方信息,缓解模型退化,使神经网络层数加深成为了可能。
纵观上述网络模型我们可以发现LeNet5的网络层数为5,AlexNet的网络层数为8,VGG16的网络层数为16,InceptionNet的网络层数为22,随着网络层数的增加,神经网络模型的变现越来越好,但是若网络层数过多,网络模型有可能会退化,这时ResNet提出了层间残差跳连,引入前方信息,缓解模型退化,使神经网络层数加深成为了可能。
综合这几次网络模型的进步,可以总结分析了卷积的五个基本步骤:
1.卷积。
2.批标准化:缓解梯度消失。
3.激活函数:提升训练速度。
4.池化。
5.Dropout:缓解过拟合。
在完成这些步骤时,适当增加网络层数来提高网络模型性能,若发现层数已经达到临界值,但效果还达不到要求,可以考虑层间残差跳连,引入前方信息,缓解模型退化,加深神经网络层数,提高模型性能
参考:
北大tensorflow2.0课程