基于深度学习的CIFAR10图像分类
摘要:近年来,随着深度学习的迅速发展和崛起,尤其在图像分类方向取得了巨大的成就。本文实验基于Windows10系统,仿真软件用的是Anaconda下基于python编程的JupyterNotebook编辑器。通过利用Google的深度学习框架Tensorflow,搭建新的卷积网络结构,提出了基于卷积神经网络的CIFAR10图像分类识别算法,主要参照经典的卷积神经网络模型LeNet-5结构,提出新的卷积神经网络结构并对飞机、汽车、鸟类、猫、鹿、狗、蛙类、马、船和卡车10种事物进行分类,该模型构建了一个输入层、三个卷积层、三个池化层、一个全连接层和一个输出层。
关键词:深度学习;图像分类;卷积神经网络
CIFAR10 image classification based on deep learning
Abstract: In recent years, with the rapid development and rise of deep learning, great achievements have been made especially in the direction of image classification. The experiment of this article is based on Windows 10 system, and the simulation software uses the JupyterNotebook editor based on Python programming under Anaconda. By using Google ’s deep learning framework Tensorflow to build a new convolutional network structure, a CIFAR10 image classification and recognition algorithm based on a convolutional neural network is proposed. The new convolution is mainly referred to the classic convolutional neural network model LeNet-5 structure. The neural network structure classifies 10 things: airplane, car, bird, cat, deer, dog, frog, horse, boat, and truck. The model builds an input layer, three convolutional layers, and three pooling Layer, a fully connected layer, and an output layer.
Keywords: deep learning; image classification; convolutional neural network
第1章绪论
1.1深度学习
提到人工智能,人们往往会想到深度学习,深度学习又称为deep Learming,是机器学习的一个子集,机器学习又是人工智能的一个子集,深度学习近年来的发展是突飞猛进的,人工智能的应用也越来越多。深度学习其本质是在模拟人类大脑神经元以及大脑的工作原理,是一个可以模拟人类大脑进行分析和学习的神经网络,它通过模仿人类大脑的工作机制来解释数据(如图像、文本和声音),深度学习通过将简单的低层次特征进行组合,形成更加抽象更为复杂的高层次特征,来拟合人们日常生活中的各种事情。深度学习被广泛用于人们息息相关的各种领域,可以实现机器翻译、人脸识别、语音识别、信号恢复、商业推荐、金融分析、医疗辅助和智能交通等,早期深度学习领域内的研究人员更多受到人类大脑工作原理的启发,但现代深度学习的发展有了自身的特点,模拟人脑不再是主导方向,已经超越了神经科学的观点。
深度学习是一门新的技术科学,但实际上目前大家所熟悉的“深度学习”基本上是深层神经网络的代名词,而早期神经网络的发展可以追溯到上个世纪40年代,深度学习的发展历史主要可以分为三个阶段,从BP算法的提出到2006年这段期间被称作萌芽期;1896年,辛顿和鲁梅哈特共同提出了BP后向传播算法,解决了当时双层网络难以训练的问题,使得神经网络进入了实用阶段,但是,随着神经网络的层数加深,研究员们发现了BP算法存在着一个缺点,在计算梯度时发生了不稳定的情况,直白来说就是离输出层越远的参数就越难以训练,要么变化非常大,要么就不发生变化,这种问题后来被称作梯度爆炸或者梯度消失,通过研究发现,随着层数递增,出现梯度爆炸或者梯度消失的情况就越明显。除了层数的限制,参数过多也成了神经网络的问题之一,对计算机的能力也提出了要求,加之那个年代很多问题的训练数据都不大,模型容易发生过拟合,泛化能力很差,除了参数的问题之外,因为BP算法本身依赖于梯度,所以神经网络在训练时容易陷入局部最小值而不能达到全局最小值,这也是存在的一个大问题。在进入二十世纪九十年代后,神经网络的发展变的相对缓慢,由于新的机器学习算法支持向量机SVM(Support Vector Machine)被提出,SVM在解决当时手写体识别等问题上成功打败了其他的浅层神经网络,在当时SVM相比其他的浅层神经网络,具有调参简单、全局最优、泛化能力强等优点,很快就成了研究的主流对象,神经网络再一次受到了冷落。
在2006到2012年期间,是深度学习的迅速发展期,在2006年,号有深度学习之父之称的Hinton教授提出了深度信念网络吗,一举打败了风光已久的SVM,这让许多研究者的目光重新回到了神经网络,并提出了“深度学习”概念和深度学习的训练方法,揭开了深度学习发展的序幕;自2012年后到今天,深度学习进入了爆发期,2012年由Hilton教授的学生提出的AlexNet 模型在Imagenet竞赛中取得了冠军,并且效果在很大程度上超过了传统的方法,经过将近十年的发展,深度学习逐渐出现了以卷积神经网络、深度置信网络、栈式自编码网络和循环神经网络为代表的模型四。现在世界各大互联网公司已经成立了专门进行深度学习工程化的研究部门,其中国外的代表公司有谷歌、微软,国内有百度和科大讯飞,均已经在语音识别、图像检索、机器翻译等领域上取得了很好的效果。
机器学习是实现人工智能的一种重要途径,而深度学习又是机器学习中极为有效的一种方法叫。以目标检测为例,基于区域选择和人工特征提取的传统方法大大增加了计算量,耗时而且无法满足实时性的要求,并且识别误差明显过大,因此传统方法遇到了瓶颈。然而,深度学习以其强大的模型表达和特征提取的能力,使精确度和实时性取得了跨越式提升,推动了目标检测领域的变革。
从宏观角度讲,深度学习中的“深度”即神经网络的层数之深,如图1.1所示,最常见的人工神经网络由输入层、隐含层和输出层构成,最左边的是输入层,其中包含输入神经元,最右边是输出层,其中包含有输出神经元,中间层就是隐含层。这种以上一层的输出作为下一层的输入,并且上一层神经元与先下一层神经元均有联系的网络,即为前馈全连接神经网络,也是最基本的神经网络。深度学习又称为深度神经网络,所以网络中隐含层的层数较大,少者数十层,多者数百层,这种结构有利于从原始数据中自主、有效的学习到复杂特征。以卷积神经网络为例,一般来讲,卷积神经网络层数越深,模型从数据中学习到的特征越复杂,识精确度越高。
深度学习中的“学习”也是核心问题之一,简单来讲,即为自动的将简单的特征组合成更加复杂的特征,并利用这些组合特征解决问题。以卷积神经网络为例,深度学习可以从图像的像素特征逐渐组合线、边、角、简单形状、复杂形状等更加有效的复杂特征。出学习的过程即为权重更新过程,通过正向传播和反向传播的结合,以损失函数的渐小为目标,不断沿着梯度的反方向更新权重的大小,直至模型合适。学习过程中,采用**函数去除模型线性化,引入正则化防止模型过拟合,以及采用梯度下降算法、学习率衰减算法等方法对学习过程进行优化。
图1.1前馈全连接神经网络
1.2经典卷积神经网络
深度学习的兴起源于深度神经网络的崛起,1989年,被世界公认的人工智能三大巨头之一的Yann LeCun教授提出了LeNet网络结构,这是卷积神经网络的鼻祖,接着在1998年,他又提出了新的LeNet结构,即LeNet-5,当时LeNet-5用于解决手写数字识别问题,输入的图片均为单通道灰度图,分辨率为28×28,在Mnist数据集上,LeNet-5达到了大约99.2%的正确率,LeNet-5模型总共7层,由两个卷积层,两个下采样(池化)层,三个全连接层组成,最后通过输出全连接层输出10个概率值,对应0~9的预测概率,网络结构如下图1.2所示。
图1.2 LeNet-5网络结构图
在往后的十多年里,越来越多的新型卷积神经网络模型被提出,其中比较经典的模型有:AlexNet、ZFNet、VGGNet、GoogleNet、ResNet、DenseNet。AlexNet[2]是在2012年由Alex Krizhevsky提出的一个深度学习模型,并赢得了视觉领域竞赛ILSVRC2012的冠军,并且大幅度超过传统的方法,在百万量级的ImageNet数据集上,识别率从传统的70%多提升到了80%多,top5预测的错误率为16.4%,远超第一名,将深度学习正式推上了舞台。AlexNet为8层结构,其中前5层为卷积层,后面3层为全连接层,在两个GPU上运行,其中学习参数有大约6千万个,神经元有650000个左右,由于当时是对1000个类别进行分类,所以在网络的最后输出是1000个类别的概率值,其中AlexNet的网络结构图如下图1.3所示:
图1.3 AlexNet网络结构图
ZFNet是基于AlexNet网络的微调,其网络结构没什么改进,只是调了调参,性能较Alex提升了不少。具体只是将AlexNet第一层卷积核由11变成7,步长由4变为2,第3,4,5卷积层转变为384,384,256。使用Relu**函数和交叉熵损失函数,TOP错误率为11.2%,是2013ImageNet分类任务的冠军,其网络结构如下图1.4所示。
图1.4 ZFNet网络结构图
2014年,由谷歌DeepMind公司研究员与牛津大学计算机视觉组合(Visual Geometry Group)共同提出了VGGNet,它是一种深度卷积网络,研究了卷积神经网络的深度和性能之间的关系,通过反复的堆叠3×3的小型卷积核和2×2的最大池化层,成功的构建了16~19层深的卷积神经网络,比较常用的是VGGNet-16和VGGNet-19。
VGGNet把网络分成了5段,每段都把多个3×3的卷积网络串联在一起,每段卷积后面接一个最大池化层,最后面是3个全连接层和一个softmax层。是2014年ImageNet竞赛定位任务的第一名和分类任务的第二名。在top5上的错误率为7.5%,目前为止,VGGNet依然被用来提取图像的特征,和AlexNet相比只是进一步加深层数(16-19层),在结构上并没有特别的创新点。可以看成是AlexNet的加强版本。为了解决初始化(权重初始化)等问题,VGG采用的是一种Pre-training的方式,这种方式在经典的神经网络中经常见得到,就是先训练一部分小网络,然后再确保这部分网络稳定之后,再在这基础上逐渐加深。图1.5从左到右体现的就是这个过程,并且当网络处于D阶段的时候,效果是最优的,因此D阶段的网络也就是VGG-16。E阶段得到的网络就是VGG-19。VGG-16的16指的是conv+fc的总层数是16,是不包括maxpool的层数。VGGNet的网络结构如下图1.5所示。
图1.5 VGGNet网络结构
GoogleNet在2014年的ImageNet分类任务上击败了VGGNets夺得冠军,GoogLeNet跟AlexNet,VGG-Nets这种单纯依靠加深网络结构层数进而改进网络性能的思路不一样,它另辟蹊径,在加深网络的同时(22层),也在网络结构上做了创新,引入Inception结构代替了单纯的卷积+**的传统操作(这思路最早由Network in Network提出)。这是一种网中网结构,即原来的节点也是一个网络,用Inception之后整个网络结构的宽度和深度都可扩大,能带来2到3倍的性能提升,GoogLeNet基于Network in Network(网中网)的思想,对卷积核进行改进,将原来的线性卷积层(linear convolution layer)变为多层感知卷积层(multilayer perceptron),使得卷积核具有更强的特征提取能力。同时使用全局平均池化层( Average pool )(即将图片尺寸变为1X1)来取代最后全连接层,去掉了全连接层使得参数大量减少,也减轻了过拟合。Inception一直在不断发展,现在已经发展到了第四代,其中最经典是Inception-v3,Inception结构里主要做了两件事。第一:通过3×3的池化、以及1×1、3×3和5×5这三种不同尺度的卷积核,一共4种方式对输入的特征响应图做了特征提取。第二:为了降低计算量。同时让信息通过更少的连接传递以达到更加稀疏的特性,采用1×1卷积核来实现降维。其网络模块结构如下图1.6所示。
图1.6 Inception-v3模块网络结构
2015年何恺明推出的ResNet(残差网络)在ISLVRC(ImageNet大规模视觉识别挑战赛)上横扫所有选手,获得冠军。ResNet网络层数达到了152层,该框架能大大简化模型网络的训练时间,使得在可接受时间内,模型能够更深,在深度学习领域中,网络逐渐加深会对网络的反向传播提出挑战,在反向传播中每一层的梯度都是在上一层的基础上计算的,层数越多会导致梯度在多层传播时越来越小,直到梯度消失,于是表现的结果就是随着层数变多,训练的误差会越来越大。ResNet在网络结构上做了大创新,即残差网络通过引入残差单元结构解决了梯度消失这个问题,残差单元ResNet在卷积神经网络的新思路,绝对是深度学习发展历程上里程碑式的事件。残差单元结构如下图1.7所示。
图1.7 残差单元结构
从上图可以看出,数据经过了两条路线,一条是常规路线,另一条则是捷径(shortcut),直接实现单位映射的直接连接的路线,这有点类似与电路中的“短路”。通过实验,这种带有shortcut的结构确实可以很好地应对退化问题。我们把网络中的一个模块的输入和输出关系看作是y=H(x),那么直接通过梯度方法求H(x)就会遇到上面提到的退化问题如果使用了这种带shortcut的结构,那么可变参数部分的优化目标就不再是H(x),若用F(x)来代表需要优化的部分的话,则H(x)=F(x)+x,也就是F(x)=H(x)-x。因为在单位映射的假设中y=x就相当于观测值,所以F(x)就对应着残差,因而叫残差网络。为啥要这样做,因为作者认为学习残差F(X)比直接学习H(X)简单。设想下,现在根据我们只需要去学习输入和输出的差值就可以了,绝对量变为相对量(H(x)-x 就是输出相对于输入变化了多少),优化起来简单很多。
DenseNet(Dense Convolutional Network)是一种具有密集连接的卷积神经网络。在该网络中,任何两层之间都有直接的连接,也就是说,网络每一层的输入都是前面所有层输出的并集,而该层所学习的特征图也会被直接传给其后面所有层作为输入。DenseNet是CVPR(国际计算机视觉与模式识别会议)2017年的最佳论文,论文中提出的DenseNet(Dense Convolutional Network)主要还是和ResNet及Inception网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效,在CIFAR指标上全面超越ResNet。可以说DenseNet吸收了ResNet最精华的部分,并在此上做了更加创新的工作,使得网络性能进一步提升。DenseNet脱离了加深网络层数(ResNet)和加宽网络结构(Inception)来提升网络性能的定式思维,从特征的角度考虑,通过特征重用和旁路(Bypass)设置,,既大幅度减少了网络的参数量,又在一定程度上缓解了梯度消失的问题,同时加强了特征传播,鼓励特征复用。稠密连接主要由两部分组成:dense block稠密块+transition layer 过渡层。其中稠密块定义了输入输出之间的连接关系,过渡层是用来控制通道数。如图1.9是一个三个稠密块的稠密连接网络。每层之间有过渡层改变通道数大小,最后一层没有过渡层。图1.10是DenseNet的网络结构。
图1.9三个稠密块的稠密连接网络
图1.10 DenseNet的网络结构。
1.3深度学习技术的应用
深度学习最早兴起于图像识别,但是在短短几年内,深度学习推广到了机器学习的各个领域,如今,深度学习在很多机器学习领域都有非常出色的表现,在图像识别、自然语言处理、自动医学诊断、网络广告投放、搜索引擎、电脑游戏、金融以及机器人等各大方面都已经有了应用,例如在谷歌,图像分类、物体识别已经被广乏应用到了谷歌无人驾驶车、谷歌地图、谷歌图像搜索等产品中[4]。基于深度学习的语音识别已经被应用到了各个领域,其中大家最为熟悉的应该是苹果公司推出的Siri系统,Siri系统可以根据用户的语音输入完成相应的操作功能,这大大方便了用户的使用。如果说深度学习在图像识别领域上的突破掀起了学术界的研究浪潮,那么深度学习在人机博弈上的突破使得这个概念被全社会所熟悉,在2016年3月,由谷歌开发的围棋人工智能系统AlphaGo和来自韩国的世界第二围棋手李世石进行了一场人机博弈,AlphaGo最终以总比分为4:1的成绩打败了李世石,AlphaGo的胜利将人工智能推向了全球瞩目的焦点,是人工智能发展史上具有里程碑意义的大事。
第2章 深度学习框架介绍
2.1 TensorFlow
2015年11月谷歌(Google)出品,基于Python和C++编写,深度学习最流行的库之一,是谷歌在深刻总结了其前身DistBelief的经验教训上形成的;它不仅便携、高效、可扩展,还能在不同计算机上运行;小到智能手机,大到计算机集群;它是一款轻量级的软件,可以立刻生成你的训练模型,也能重新实现它;TensorFlow有强大的社区、企业支持,因此它广泛应用于从个人到企业、从初创公司到大公司等不同群体[1]。2019年10月已发布最新的TensorFlow2.0 版本。
2.2 Caffe
Caffe的全称是Convolutional Architecture for Fast Feature Embedding(快速特征嵌入的卷积架构),它是一个清晰、高效的深度学习框架,于2013年底由加州大学伯克利分校开发,这个卷积神经网络框架,专注于卷积神经网络和图像处理,是用C++语言所编写,执行速度非常快。适合工业界开发。
2.2 Chainer
Chainer诞生于2015年,于2016年转向开源正式进入公众视野。用Python开发的。一个强大、灵活、直观的机器学习Python软件库,能够在一台机器上利用多个GPU,由深度学习创业公司Preferred Networks开发,在Github上有相当数量的项目;Chain的设计基于“define by run”原则,也就是说,该网络在运行中动态定义,而不是在启动时定义,这也是该框架的一大亮点。
2.3 CNTK
CNTK(Computational Network ToolKit)是微软研究人员开发的用于深度神经网络和多GPU加速技术的完整开源工具包。微软称CNTK在语音和图像识别方面,比谷歌的TensorFlow等其他深度学习开源工具包更有优势。
2.4 DeepLearning4j
Deeplearning4j是”for Java”的深度学习框架,也是首个商用级别的深度学习开源库。Deeplearning4j由创业公司Skymind于2014年6月发布。专注于神经网络的java库,可扩展并集成Spark、Hadoop和其他基于Java的分布式集成软件。
2.5 PyTorch
2017年1月,由Facebook人工智能研究院(FAIR)基于Torch推出了PyTorch。PyTorch是一个基于Python的库,用来提供一个具有灵活性的深度学习开发平台。PyTorch的工作流程非常接近Python的科学计算库——numpy。网上有人声称:在各种深度学习库中,PyTorch是最灵活、最容易掌握的。并且认为PyTorch是一个非常有可能改变深度学习领域前景的Python库。
第3章 数据集处理
3.1数据集介绍
数据是深度学习的前提,是深度学习的重要原材料,是驱动深度学习提高识别率和精确度的核心因素。有了数据,才能对图像进行预处理。本文数据集CIFAR-10(Canadian Institute for Advanced Research,CIFAR)是一个用于识别普适物体的小型数据集。由Hinton 的学生Alex Krizhevsky 和Ilya Sutskever 整理的一个用于识别普适物体的小型数据集。一共包含10个类别的RGB 彩色图片:飞机(airplane)、汽车(automobile)、鸟类(bird)、猫(cat)、鹿(deer)、狗(dog)、蛙类(frog)、马(horse)、船(ship)和卡车(truck)。如图3.1所示。每个图片的尺寸为32×32 ,每个类别有6000个图像,数据集中一共有50000张训练图片和10000张测试图片。
图3.1 cifar-10数据集
3.1.1 与MNIST 数据集中目比,CIFAR-10数据特点
(1)CIFAR-10是3通道的彩色RGB图像,而MNIST是灰度图像。
(2)CIFAR-10的图片尺寸为32×32,而MNIST的图片尺寸为28×28,比MNIST稍大。
(3)相比于手写字符,CIFAR-10含有的是现实世界中真实的物体,不仅噪声很大,而且物体的比例、特征都不尽相同。
3.1.2 CIFAR-10 数据集的数据文件名及用途
在CIFAR-10数据集中,如图3.2,在文件夹cifar-10-batches-py下分别含有文件data_batch_1、data_batch_2、data_batch_3、data_batch_4、data_batch_5和test_batch中各有10000个样本。故共有50000个训练样本和10000个测试样本。样本和样本直接没有多余的字节分割,所以这几个二进制文件的大小都是几乎一样的,每一个样本的第一个字节为标签label,剩余字节为图像数据,如图3.3所示。表3.1是文件用途的详细说明。
图3.2 cifar-10文件
图3.3 cifar-10文件分类
文件名 |
文件用途 |
batches.meta |
文件存储了每个类别的英文名称。可以用记事本或其他文本文件阅读器打开浏览查看 |
data_batch_1、data_batch_2、data_batch_3、data_batch_4、 data_batch_5 |
这5 个文件是CIFAR- 10 数据集中的训练数据。每个文件以二进制格式存储了10000 张32 × 32 的彩色图像和这些图像对应的类别标签。一共50000 张训练图像。 |
test_batch |
这个文件存储的是测试图像和测试图像的标签。一共10000 张 |
readme.html |
数据集介绍文件 |
3.2 数据增强介绍
卷积神经网络虽然很强,但是需要的数据集是要求足够大的,通常情况下是越大越好,这样神经网络学习到的特征更多,生成的模型更好,如果数据集不充分,这样很大程度上会导致模型过拟合或欠拟合等情况的发生,通过不断拍摄来获得新图像以此来扩充数据集是不太现实的,当我们的数据非常有限时,我们可以通过一些变换,从已有的数据集中,去生成一些新的数据,来扩充数据集。根据相关论文提出的数据增强方式,通常对获取的原始数据采取了水平翻转、上下翻转、白化处理、改变对比度和随机裁剪等方式来增大了本文的数据样本量。
3.2.1 图像缩放
通常网络上获取多张图像的像素大小不是固定的,但是神经网络输出的节点个数却是固定的,所以在将图像的像素作为输入提供给神经网络之前,需要对图像进行固定尺寸的缩放,即将图像的大小进行统一。图像缩放是指把像素不同的图像缩小或放大制定像素大小的图像。本文软件用的是Anaconda下基于python编程的Jupyter Notebook对原像素为500X400的JPG格式图像进行缩小和放大。如图3.4、3.5、3.6所示。
图3.4 原始500x400尺寸 图3.5 缩小至256x256
图3.7 放大至1000x1000尺寸
3.2.2 图像水平和上下翻转
图像的翻转分为水平翻转和上下翻转,图像水平翻转就是指将图像左半部分和右半部分按照图像垂直中轴线进行对换,同理,上下翻转就是将图像上半部分和下半部分按照图像水平中轴线进行翻转。如图3.8、3.9所示。之所以将图像进行翻转,是因为在很多图像识别问题中,图像的翻转不应该影响到识别的结果的。于是,在训练图像识别的神经网络模型的时候,可以随机地翻转训练图像,这样训练得到的模型,可以达到识别不同角度的实体。比如说在训练数据中,所以狗的图像都是向右的,那么训练出来的模型,它就没办法很好地识别小狗的头的朝向是向左的图片,模型对它的分类有可能不是很准确。虽然这个问题是可以通过收集更多的训练数据来解决的。但是通过这种随机翻转训练图像的方法,事实上是在零成本的情况下解决或缓解这个问题的。所以这个随机翻转训练图像是非常好用且常用的图像预处理方式。在训练VGGNet、ResNet等大型的神经网络的时候,都采用了对图像进行翻转的技术。
图3.8 水平翻转 图3.9 上下翻转
3.2.3 图像随机裁剪与填充
除了能将图像的整张信息进行处理与保存,TensorFlow还提供了API对图像进行随机裁剪和缩放后填充。如果目标图像尺寸小于原始图像尺寸,则在中心位置裁剪,反之则函数会自动在原始图像四周补充全零背景,即用黑色像素进行填充。如图3.10,3.11、3.12所示。
图3.10随机裁1像素制定为200x200 图3.11随机裁2 像素指定为200x200
图3.11黑色像素填充 像素指定为1000x1000
3.2.4 改变图像对比度
在图像任务中,对输入图像进行简单的平移、翻转等,调整图像的亮度、饱和度、对比度等,都不应该影响图像的类别。比如水平翻转的狗的图像,它的类别还是犬类。所以在对训练神经网络模型的时候,可以随机调整训练图像的这些属性,从而使得训练得到的模型,尽可能少的受到无关因素的影响。在TensorFlow中,可以在指定区间范围内,随机地调整图像的对比度。以修改图像的对比度为例。如图3.12、3.13所示。
图3.12 对比度降了1/2 图3.13 对比度提高2倍
3.2.5 图像白化处理
除了图像以上的操作,TensorFlow还提供了一些函数对图像进行标准化。这个标准化操作,就是将图像的像素值转化为零均值和单位方差,即图像的白化处理。所以白化处理的目的,是使图像均值为0,方差为1。如图3.14所示:
图3.14 白化处理
3.3 数据集展示
数据集CIFAR-10一共包含10个类别的RGB彩色图片:飞机(airplane)、汽车(automobile)、鸟类(bird)、猫(cat)、鹿(deer)、狗(dog)、蛙类(frog)、马(horse)、船(ship)和卡车(truck)。每个图片的尺寸为32×32 ,每个类别有6000个图像,数据集中有50000张训练图片和10000张测试图片,共有60000张图片。图3.15是对数据集中的部分展示。
图3.15 数据集的部分展示
第4章 基于卷积神经网络的cifar-10图像分类识别
4.1卷积神经网络简述
早在20世纪60年代,美国神经生物学家Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出卷积神经网络(Convolutional Neural Network,简称CNN)。卷积神经网络是深度学习中最经典的模型之一,它是一种前馈神经网络,它的神经元可以响应一部分覆盖范围内的周围单元,对大规模的模式识别都是有着非常好的性能表现,尤其是对大规模图像图像的处理效率极高,这也是大家热衷研究这类网络的重要原因。
现在,CNN已经成为众多科学领域的研究热点之一,特别是在模式分类领域,由于该网络避免了对图像的复杂前期预处理,可以直接输入原始图像,因而得到了更为广泛的应用。日本人福岛邦彦(Kunihiko Fukushima)在20世纪90年代提出的新识别机是卷积神经网络的第一个实现网络[1]。随后,更多的科研工作者对该网络进行了改进。相比传统神经网络,卷积神经网络提出了局部感受野和权值共享策略,极大地减少了权重参数量,因此得到了非常广泛的使用,已经在图像分类、目标识别、目标检测、语义分割等方面表现非常出色。
4.1.1 局部感受野
局部感受野概念起源于神经科学,其中神经元的感受野是身体感知的一部分,影响神经元的射击,当神经元处理大脑所看到的感觉输入时,它们有一个特定的“视野”。这种视野传统上被称为局部感受野[2]。该“视野”可以对应于一块皮肤或一个人的视野的一部分。基于人脑的图片识别过程,我们可以认为图像中距离较近的像素点之间,它们的联系与相关性是比较强的,而距离较远的像素点之间,它们的联系和相关性是比较弱的,基于这个思想,每个神经元没有必要再对整幅的像素点进行连接,只需要感知图像中的局部信息,对部分的像素点进行连接,而在更高层次再对局部信息进行通过卷积滑动窗口等综合操作得出图像的全局信息。卷积体系结构借用“局部感受野”的计算概念。在卷积神经网络中,感受野(Receptive Field)的定义是卷积神经网络每一层输出的特征图(feature map)上的像素点在输入图片上映射的区域大小。如图4.1所示,神经元感受野的值越大表示其能接触到的原始图像范围就越大,也意味着它可能蕴含更为全局,语义层次更高的特征;相反,值越小则表示其所包含的特征越趋向局部和细节。因此感受野的值可以用来大致判断每一层的抽象层次。
图4.1 局部感受野
图4.2 全连接和局部连接图
如图4.2所示,在全连接中,输入一张像素为1000x1000的图像,现假设下一个隐藏层的神经元数目是100万(106)个,那么此时的参数量是1000x1000x106=1012个,这么多的参数是很难训练的;而在局部连接中,隐藏层的每个神经元仅与图像中10×10的区域相连,然后通过滑动扫描整幅图像,那么此时的参数量是10×10×106=108个,参数量直接少了4个数量级[7]。
4.1.2 权值共享
如下图4.3所示,在局部连接中,运用局部感受野,参数量减少了4个数量级,但是参数数量还是有一亿(108)个,而如果这时通过权值共享,同一组卷积核共享一组权值,那么此时不论隐藏层神经元的个数是多少,那么需要训练的权值参数是10x10=100个,假设有100个卷积核,那么最终的参数数量也只有10×10×100=10000个,一个卷积核得到一个特征图,即提取图像的一种特征,如果需要获得更多的特征,可以增加卷积核的数量。
图4.3 局部连接和卷积图
4.2卷积神经网络的基本组成
一个基本的卷积神经网络通常由卷积层、池化层和全连接层三个基本元素来定义。典型的卷积神经网络结构主要由输入层、卷积层、池化层、全连接层以及Softmax输出层五部分构成,如图4.4所示。卷积神经网络常用的架构模式,可以把若干个卷积层进行叠加,然后选择是否叠加一个池化层,重复这个结构若干次,最后叠加若干个全连接层。
图4.4 卷积网络的基本结构
4.2.1 输入层
一般来讲,输入层就是将图像作为输入,在处理图像的卷积神经网络中,它代表一张图片的像素矩阵,是卷积操作的直接数据。
4.2.2 卷积层
卷积层是卷积神经网络的核心部件,卷积单元实际上为一个权值矩阵,可看作一个从原始图像矩阵中提取特定信息的过滤器,它们具有过小的接受域,深度与输入层相同。不同卷积单元可提取不同的特征,通过对卷积单元参数进行学习来从原始图像中提取信息,从而来帮助网络进行正确的预测。多层卷积中,第一层通常提取的是一般性特征,深层的卷积神经网络能够提取更加复杂具体的特征,使得泛化性变强。同时,采用权值共享的方式即相同的卷积单元通过滑动平移来对输入层进行卷积。为了解决边缘像素点与中间像素点利用率相差较大的问题,采取对图像边缘进行填充的方式。与传统的全连接不同,卷积层中每个节点的输入只是上一层神经网络的一小块,这个小块常用的大小有3×3或者5×5。与普通神经网络相比较,通常把卷积神经网络中的卷积层叫作C层(特征提取层),卷积层的输入来源于输入层或者池化层,我们称将一组固定的权重和不同窗口内数据做矩阵内积后求和的过程叫做卷积操作,如图4.5所示是卷积操作,最后得到目标像素值。
图4.5 卷积操作
在卷积层中,每个神经元与上一层的输入(特征图)中的神经元仅仅只是部分连接的,卷积层试图将神经网络中的每一小块进行更加深入地分析,从而得到抽象程度更高的特征。一般来说,通过卷积层处理过的节点矩阵会变得更深,所以随着层数的加深经过卷积层之后的节点矩阵的深度也会加深。相比普通神经网络,卷积神经网络中提出的权值共享策略,通过减少网络中层与层之间的连接,从而使得权值数量变得更少,大大减小了计算量,同时又降低了过拟合的风险。卷积层中的每一个特征图都有一个与之相对应的卷积核,并且与卷积核的大小相同,卷积层的每一个特征图是通过不同的卷积核在前一层输入的特征图上作卷积,然后将对应元素累乘之后,再加一个偏置,最后通过**函数所获得的。
4.2.3 池化层
在卷积神经网络中,进行卷积之后,通常会跟着一个池化层,池化层是对上一层的特征图进行下采样处理,代表着对统计信息的提取过程,池化的目的在于减小特征图的空间大小,也就是减少网络中的参数和计算量,加快运算速度。在深度学习中最常见的池化方式有两种,分别是最大值池化和均值池化。其中,最大值池化是选取小区域内像素的最大值,而均值池化是选取小区域内像素总和再求平均值。如下图4.6所示,均是对原始像素矩阵做2×2的池化操作。
图4.6 池化操作
在卷积层之间引入池化层,将特征图分成若干个区域,对区域进行最大池化或均值池化,从而减少图像空间大小,减少后续计算量控制过拟合问题。池化层的引入只是对输入的特征图进行降维处理,不改变特征图的个数,具有不变性。故池化后的图像仍保留了输入图像的主要特征信息,但图像尺寸得到大大缩小。
4.2.4 全连接层
所谓连接,就是神经元组织在一起的形式。全连接是指前一层每一个神经元的输出都连接到后一层所有的神经元。为了得到分类类别数量的输出,卷积神经网络的输出层应用全连接层,把提取出的所有局部特征融合成全局特征。损失函数用于计算预测误差,误差会进行反向传播,用以不断改进更新旧积核参数以及偏置的值,与普通神经网络相同,全连接层用来进行最后的回归与分类。
4.2.5 输出层
卷积神经网络的输出层一般为分类器层,常用的有Softmax回归分类器和sigmoid输出单元以及径向基(RBF)函数输出单元。通常Softmax函数用于解决多分类问题,所以采用Softmax函数作为输出层的**函数,用于cifar-10多分类识别任务中。简单来说,Softmax就是将上一层的输出通过Softmax函数作用后,输出值就转变成了[0,1]范围的值,而这些值满足概率的性质,累加在一起的结果为1,可以将它理解成为概率值,最后选取概率值最大的节点作为输出节点。Softmax函数的计算公式如式3.1所示:
σ(Z)j=ezjK=1KeZK -------(3.1)
4.3 **函数
**函数的主要作用就是用来加入非线性因素,以解决线性模型表达能力不足的问题,在整个神经网络里起着至关重要的作用,如果神经网络中没有加入**函数,那么可以将其看作是一种线性表达,从而导致网络最终的表达能力不好,在加入一些非线性的**函数后,整个网络中就相当于引入了非线性部分,这将增强网络的表达能力,在神经网络里常用的**函数有Sigmoid、Tanh和relu等。
4.3.1 Sigmoid**函数
Sigmoid 函数又叫做Logistic函数,就是逻辑回归的模型函数。sigmoid是常用的**函数,其数学表达式如下式3.2所示,导数表达式如式3.3所示:
fx=11+ex -------(3.2)
f'(x)=f(x)(1-fx)------(3.3)
Sigmoid函数曲线下图4.7所示,其中x可以是正无穷到负无穷,但是对应的y却只有0~1的范围,所以经过Sigmoid函数输出的值都会落在0~1的区间里,即Sigmoid函数能把输入的值“压缩”到0~1之间,Sigmoid函数优点在于简单、容易理解,但是在反向传播求误差梯度时,涉及对**函数求导数,由其函数曲线图可以看出,当取值足够大时,其导数值趋于0,反向传播求误差梯度遵循链式求导法则,这就很容易出现越往前传递,梯度逐渐消失的情况,从而终止梯度传递,陷入死神经元,同时Sigmoid函数收敛速度缓慢。
图4.7 sigmoid函数图像
4.3.2 Tanh**函数
Tanh函数又称为双曲正切函数,可以说是Sigmoid函数的值域升级版,Tanh函数的值域在-1~1之间,其数学表达式见式3.4,其导数如式3.5所示:
fx=ex-e-xex+e-x -------(3.4)
f'(x)=1-f(x)2------(3.5)
Tanh函数曲线如图4.8所示,其x取值也是从正无穷到负无穷,对应的y值变为-1~1之间,相对于Sigmoid函数有更广的值域,同样可以从其曲线图4.8看出,Tanh函数容易出现饱和和终止梯度传递等问题。
图4.8 Tanh函数图像
4.3.3 Relu**函数
Relu全称是线性整流函数(Rectified Linear Unit, Relu),又称修正线性单元,也是常用**函数,其数学表达式如下式3.6所示:
fx=max(0,x)-------(3.6)
可以看出该式非常简单,大于0的留下,否则为0,其函数曲线图如图4.9所示,Relu函数应用的广泛性与它的优势是分不开的,这种对正向信号的重视,忽略了负向信号的特性,与我们人类神经元细胞对信号的反映及其相似,所以在神经网络中取得了很好的拟合效果,另外Relu函数运算简单,大大提高了机器的运行处效率。
图4.9 Relu函数图像
4.4 优化算法梯度下降法
在机器学习中,优化损失函数的算法对于优化损失函数非常重要,它决定了损失函数的收敛速度,是否容易收敛甚至能不能收敛,是否收敛在全局最小处。本文主要接受一种常见的优化损失函数的算法,即梯度下降法(gradient descent)。
梯度下降法的优化思想是用当前位置负梯度方向作为搜索方向,因为该方向为当前位置的最快下降方向,所以也被称为是“最速下降法”。最速下降法越接近目标值,步长越小,前进越慢。它是求解无约束最优化问题的一种最常用且最经典的算法,有实现简单的优点。是一种迭代算法,每一步需要求解的目标函数的梯度向量。其不仅常用于机器学习算法,而且也是深度学习常用的优化算法。梯度下降算法背后的原理:目标函数J(θ)关于参数θ的梯度将是目标函数上升最快的方向。对于最小化优化问题,只需要将参数沿着梯度相反的方向前进一个步长,就可以实现目标函数的下降。这个步长又称为学习速率η。参数θ更新公式如下式3.6所示:
θ←θ-η∇θJ(θ)------(3.6)
其中∇θJ(θ)是参数θ的梯度。
根据计算目标函数J(θ)采用数据量的不同,梯度下降算法又可以分为批量梯度下降算法(Batch Gradient Descent),随机梯度下降算法(Stochastic Gradient Descent)和小批量梯度下降算法(Mini-batch Gradient Descent)。
在梯度下降法中,批量指的是用于在单次迭代中计算梯度的样本总数假定批量是指整个数据集,数据集通常包含很大样本(数万甚至数千亿),此外,数据集通常包含多个特征。因此,一个批量可能相当巨大。如果是超大批量,则单次迭代就可能要花费很长时间进行计算。
批量梯度下降算法(BGD):是在整个数据集上计算J(θ)后才进行梯度下降,数据集大的话容易造成内存不足,其优化一般比较慢。(与数据集的大小有关,一般数据集大的话,不采用)。
随机梯度下降算法(SGD):是在一个样本上计算J(θ)后就进行梯度下降,是批量梯度下降算法的一个极端。其迭代收敛速度一般会快些,但是由于样本的随机性强,每一步迭代并不一定朝梯度下降的方向进行,虽然整体会朝梯度下降方向进行,但无法达到全局最小值。每次迭代只使用一个样本(批量大小为1),如果进行足够的迭代,SGD也可以发挥作用。“随机”这一术语表示构成各个批量的一个样本都是随机选择的。
小批量梯度下降算法(MBGD):小批量梯度下降算法是批量梯度下降算法和随机梯度下降算法的折中,选取训练集中一个小批量样本计算J(θ),小批量通常包含10-1000个随机选择的样本。小批量SGD可以减少SGD中的杂乱样本数量,但仍然比全批量更高效。这样可以保证训练过程更稳定,而且采用批量训练方法也可以利用向量化计算的优势。这是目前深度学习中最常用的梯度下降算法。
下面是梯度下降法的各种改进算法[7][8][9]。
动量(Momentum)梯度下降算法是BorisPolyak在1964年提出的,momentum是模拟物理里动量的概念,积累之前的动量来替代真正的梯度。其基于这样一个物理事实:将一个小球从山顶滚下,其初始速率很慢,但在加速度作用下速率很快增加,并最终由于阻力的存在达到一个稳定速率。动量梯度下降算法是基于SGD的改良版,其更新方程如下图4.10所示(动量用β表示,通常设为0.9)。
图4.10 动量优化器更新方程
RMSprop(root mean square prop)优化算法,其原理类似于动量梯度下降算法,都是消除梯度下降过程中的摆动来加速梯度下降的方法。RMSprop优化器限制了垂直方向上的振荡,使我们的算法可以在水平方向上采取更大的步,进行更快地收敛。RMSprop优化器和梯度下降优化器的区别主要在于它们的计算方法。其更新方程如图4.11所示。
图4.11 REMSprob优化器更新方程
Adam (Adaptive Moment Estimation)优化算法的基本思想就是将 Momentum 和 RMSprop 结合起来形成的一种适用于不同深度学习结构的优化算法。Adam组合了Momentum 和 RMSprop的优化算法。其普适性强,效果好,速度也很快。因此是深度学习常用的优化算法。算法中通常beta_1=0.9,beta_2=0.999,其更新方程如图4.12所示。
图4.12 Adam更新方程
第5章 构建卷积神经网络
5.1构建网络结构
针对本文的数据集样本量并非很大,同时考虑训练时间的长短等因素,现在借鉴LeNet-5模型的基础上,采用一个由3个卷积层、3个池化层、1个基于线性整流函数**的全连接层和一个softmax并使用dropout方法减少过拟合的输出层组成的卷积神经网络模型。卷积层的卷积核的大小均为3×3,**函数均采用ReLu,卷积层填充方式均为“SAME”,即卷积之后图像大小不变。池化层采用了max_pool,池化的大小为2×2,即每次将图像的大小,变为原来的1/4。优化函数选用Adam优化器,损失函数选用交叉熵。此外,为了防止在全连接层出现过拟合,加入了dropout来避免过拟合。同时,为防止梯度下降过快,从而导致错过参数的最优值,本文学习率取0.0001的初始值。本文采用的卷积神经网络结构,如图5.1所示。
图5.1 本文采用的网络结构
5.2 定义共享函数
共享函数共有四个,分别是权值函数、偏置函数、卷积函数和池化函数。
在构建模型时,需要初始化权值,本文使用的是TensorFlow提供的截断的正态函数(truncated_normal)来生成标准差为0.1的随机数来初始化权值。同时初始化偏置为0.1。初始值可以是随机值,常数,或者是通过其他变量的初始值得到,也就是初始值是多少不重要,通常,不影响整个模型优化的最终结果。卷积函数是直接调用TensorFlow里的2维卷积函数,卷积核为3x3,步长为1,填充方式为“SAME”,即卷积之后图像的大小不变。池化函数直接调用TensorFlow的最大池化(max_pool)函数,卷积核大小为2X2,步长为2,即池化之后,图像的尺寸变为原来的1/4,也就是原图像尺寸的长和宽各缩小原来的1/2。
5.3 定义网络结构函数
该网络结构函数的定义顺序是对应图5.1所示的网络结构。即输入层、卷积层1、池化层1、卷积层2、池化层2、卷积层3、池化层3、全连接层、输出层。每个卷积层均采用Relu**函数。在全连接层,加入了dropout函数,来避免过拟合。除去输入层,共8层网络结构。
5.4 构建模型
在定义网络结构函数之后,就可以构建模型了。首先定义一个占位符,命名为“label”即为标签值,因为共10分类,其shape为10。损失函数选用交叉熵函数。优化器选择Adam优化器,目标为最小化损失函数,学习率指定为0.0001。另外定义准确率函数,方面以后更好地查看模型训练的结果。
5.5 训练模型
5.5.1 设置训练参数
在模型构建好之后,就可以准备训练了。首先设置好超参数。所谓超参数通常是指那些在机器学习算法训练的步骤开始之前设定的一些参数,这些参数值是没办法通过算法本身学会的。这里设置迭代次数是120轮,批量的样本大小为50,即一次训练50个样本数据。之后启动会话,就可以进行迭代训练了。
5.5.2 断点续训
模型的训练,尤其对于大规模的复杂的网络,它的训练时间非常长,往往需要数个小时,甚至是数天,有时候还会因为某个原因导致了计算机宕机,遇到这样的情况,前面的训练就会前功尽弃了。解决的方案就是添加一个断点续训的机制,即每次程序执行训练后,将模型的权重等参数保存下来,下次程序在执行训练之前,可以先加载模型之前训练得到的权重等参数,再接着继续训练就可以了。具体做法是先定义一个检查点文件的存储路径,这里就用当前路径下的 “CIFAR10_log”,当这个目录不存在的时候,就创建一个。如图5.2所示。
图5.2 断点续训
5.5.3 查看训练结果
前面设置了120次迭代,一次训练50个样本,每训练一轮结束后,显示损失值和准确率。如图5.3、5.4所示。能够看到在120轮后,准确率达到96%。下面画出训练集的损失值和准确率随着训练轮数增加变化的曲线图。如图5.5、5.6所示。
图5.3 第1轮训练结果
图5.4 第120轮训练
图5.5 损失值变化曲线
图5.6 准确率变化曲线
5.5.4 计算测试集准确率
在训练集上的准确率已经达到90%以上了,现在可以把模型用在测试集中去测试一下在测试集中,是否依旧表现良好。图5.7是测试集上的准确率。容易看出,模型的泛化能力并不好,在测试集上只达到72%的准确率。
图5.7 测试集准确率
5.5.5 显示模型预测结果
可视化测试集显示前10张的预测结果。如图5.8所示。能够看到第8张图片预测错误。
图5.8 显示10张预测结果
第6章 总结与展望
6.1 总结
本文在理解LeNet-5结构的基础上,提出一种CIFAR10图像分类的卷积神经网络结构。在训练集上达到了96%的准确率,但在测试集上只有72%,说明模型的泛化能力并不是很好,这可能是存在过拟合问题,这个后期应该可以通过加入正则化来缓解过拟合问题。
6.2 展望
本文研究了深度学习算法在CIFAR10图像分类方面的应用,简述了卷积神经网络以及经典模型。深度学习是机器学习领域内新型的学科,是近年来人工智能领域取得的最重要的突破之一。深度学习中的卷积神经网络算法分类效果好,适应性更强,但是它的缺点也是显而易见的,为了使神经网络具有较高的泛化能力,它需要大量数据作为训练样本,计算量也非常大。当前,随着大数据和人工智能时代的到来,基于深度学习的卷积神经网络这个课题提供了新的机遇和挑战,因此值得展开更深入的研究。
参考文献
[1] 高扬,卫峥.白话深度学习与TensorFlow[M].北京:机械工业出版社,2018.
[2] 邹伟,姚新新 译 基于TensorFlow的深度学习[M].北京:中国电力出版社,2019.
[3] 蒋子阳 TensorFlow深度学习算法原理与编程实战[M].北京:中国水利水电出版社,2019.
[4]李卫.深度学习在图像识别中的研究及应用[D].武汉:武汉理工大学,2014.
[5]丰晓流,基于深度学习的图像识别算法研究[D],太原:太原理工大学,2015.
[6]周凯龙,基于深度学习的图像识别应用研究[D].北京:北京工业大学,2016.
[7] https://www.cnblogs.com/jackhehe/p/9808368.html
[8] https://www.cnblogs.com/jackhehe/p/9808368.html
[9] http://blog.itpub.net/31509949/viewspace-2156472
[10] https://cloud.tencent.com/developer/article/1491393
[11] 胡貌男,邱康,谢本亮.基于改进卷积神经网络的图像分类方法[J].通信技术,2018,51(11):2594-2600.
[12] 卷积网络深度学习算法与实例[J]. 陈旭,张军,陈文伟,李硕豪. 广东工业大学学报. 2017(06)
[13] 基于卷积神经网络的手写数字识别[J]. 李斯凡,高法钦. 浙江理工大学学报(自然科学版). 2017(03)
[14] 一种改进的BP神经网络手写体数字识别方法[J]. 王燕. 计算机工程与科学. 2008(04)
[15] 基于卷积神经网络图像分类优化算法的研究与验证[D]. 石琪.北京交通大学 2017