基于卷积神经网络的人脸识别

时间:2022-09-14 01:52:06

【摘要】深度神经网络是一种逐层贪婪无监督的学习方法,这是一种思想,需要依赖具体的模型去实现。常见的深度学习模型有受限玻尔兹曼机(Restrieted Bohzmann Machine,RBM)、深度信念网络...

基于卷积神经网络的人脸识别

摘要:为了了解为何卷积神经网络相比于其他神经网络有更好的特征学习能力,文章对卷积神经网络的近几年发展趋势以及基本结构进行介绍。进行了对于全连接的前向传播以及后向传播的推导,该推导用于阐述神经元的权值更新以及学习率。对卷积神经网络的调参以及参数的解析,阐述了如何对参数训练进行调整来使得小数据集有更好的识别率。

关键词:深度学习;卷积神经网络;人脸识别;全连接推导;参数训练

中图分类号:TP18 文献标识码:A 文章编号:1009-3044(2016)29-0187-04

深度学习是2006年机器学习领域的泰斗,加拿大多伦多大学的G.E.Hinton教授最先提出的理,他和他的学生R.R.Salakhutdinov在science上发表了一篇论文。这篇论文主要有两个观点:1)多隐层的人工神经网络拥有更为优势的特征学习能力,学习获得的特征对数据本身的描述更为清晰,使得可视化或分类更为有效;2)深度神经网络(Deep Neural Networks,DNN)所产生的在训练上的难点,可以通过“逐层初始化”(layer-wise pre-training)来有效进行解决,而逐层初始化使用的是无监督学习进行实现的。

2012年6月,《纽约时报》展露了Google Brain项目,该项目是由斯坦福大学机器学习教授Andrew Ng和大规模计算机系统的世界顶尖专家Jeff Dean共同主导,利用16000个CPU Core的并行计算平台来训练“深度神经网络”的机器学习模型,在图像识别和语音识别等的领域都获得了巨大的成功。2013年1月,在百度年会上,百度创始人兼CEO李彦宏宣布成立百度研究院Institute of Deep Learning(IDL),第一个重点研究的方向就是深度学习。2013年4月,《MITTechnology Review(麻省理工学院技术评论)》杂志将深度学习列为2013年十大突破性技术(Breakthrough Technology)之首。

深度神经网络是一种逐层贪婪无监督的学习方法,这是一种思想,需要依赖具体的模型去实现。常见的深度学习模型有受限玻尔兹曼机(Restrieted Bohzmann Machine,RBM)、深度信念网络(Deep Belief Networks,DBN)、堆栈式自动编码器(stackedAuto-encoder,SAE)E31和卷积神经网络(Convolutional Neural Net-works,CNN)。

1卷积神经网络

卷积神经网络是一种包含卷积层的神经网络,20世纪60年代,Hubel和Wiesel在研究猫的脑皮层中,用于局部敏感和方向选择的神经元时,发现其特殊的网络结构可以有效降低反馈神经网络的复杂性。受研究的启发,模型模仿视皮层的简单细胞和复杂细胞交互处理视觉信息的过程,简单细胞负责响应获得不同方向的边缘信息,而复杂细胞则负责累积相近简单细胞来输出结果,这个结构被称为Hubel-Wiesel结构。CNN包含多个Hubel-Wiesek结构阶段,每个阶段一般都包含模拟简单细胞卷积操作和模拟复杂细胞池化操作。

CNN主要用来获取位移、所放以及其他形式旋转不变的二维图像数据的显著特征,因为图像的局部感知区域允许神经元或者处理单元访问到最底部基础特征。由于CNN特征的检测层通过训练数据来学习,避开了显式的特征抽取,而是在隐式地训练数据中学习;由于同一个特征映射面上,神经元权值相同。因此神经网络进行并行学习,这是卷积神经网络的一个优点。

卷积神经网络在语音识别和图像处理方面有得天独厚的优势,是由于它的局部感知和权值共享结构使其更接近现实世界的生物神经网络,权值共享结构降低了神经网络的复杂性,这可以避免进行数据重建时,特征提取与分类过程的复杂度。

2卷积神经网络的基本结构

以卷积神经网络进行的人脸识别为例的CNN结构,如图1,不包括输入层,该网络有7层组成,其中包括3层卷积层、2层采样层、1层全连接层和1层输出层。图1中第一个卷积层有6个特征映射,每个特征映射都是28×28神经元阵列,每个神经元负责把5×5的区域使用卷积滤波器提取局部里的特征。

下面介绍卷积层的局部感知域、权值共享以及采样层的池化操作。

2.1局部感知域

局部感知域(10cal receptive fields),普通神经网络会把输入层和隐含层直接进行全连接的设计,从整幅图像来计算相对较小的图像的特征是可行的,但是,如果是更大的图像,这将会非常耗时。卷积层是解决这类问题的一种简便的方法是输入单元和隐含单元间进行限制,使得每个隐含单元连接输入单元的一部分。对于输入图像,每个隐含单元可以连接输入图像的一小部分相邻区域。

2.2权值共享

权值共享(shared weights)是一种节省训练开销的策略。输入层是32x32的人脸灰度图像矩阵,输出是其识别的结果,CNN复合了多个“卷积层”和采样层对输入的图像矩阵进项处理,而后在全连接层进行实现与输出目标矩阵之间的映射。每个卷积层和采样层都包含着多个特征映射(feature map),每―个特征映射一个“平面”,平面由多个神经元构成,通过一种卷积的滤波器用来提取输入的一种特征。如图2,输入图是7×7×3的矩阵,使用的过滤器是3×3×3,卷积的步长为2,每个进行卷积的矩阵是3×3×3,分别平移,通过过滤器后计算获得3x3x3的输出图。

2.3池化

池化(pooling)也称下采样(down-samples),其目的是为减少特征映射,当在面临计算量非常大的时候,一个拥有过多特征输入的分类器不易形成,并且容易过拟合。由于卷积后的特征是一种静态属性,所以可能在两个不同图像区域的特征极可能一样,因此,描述大图像的时候可以对不同位置特征使用聚合统计。相对于卷积运算,池化常用的运算一般有:最大池化(Max Pooling)、均值池化(Mean Pooling)、高斯池化和可训练池化。最常见的池化规模2x2,步长为2,如图3所示,输入的每个2x2进行下采样。每个MAX操作对四个数操作后分别获得一个值,池化操作的结果是使其深度大小不变。

3全连接的反向传播算法推导

在经典的CNN中,一般前几层都是卷积和下采样交替,在靠近输出层时的最后一些层,是全连接的一维网络。这时候,将所有二维的特征映射转化为全连接的一维网络输入。在准备将最终二维特征映射输入到一维网络中的时候,最简便的方法就是把所有输出的特征映射变成一个长的输入向量连接起来,便是全连接的作用。在此之前,参考了一些经典的反向传播算法。

3.1前向传播

在下面的推导公式里,前向传播(Feedforward Pass)采用的是平方误差代价函数。讨论的是多类问题,一共有c类,Ⅳ个训练样本。

tnk表示的第n个样本的标签对应的第k维。ynk表示第n样本对应的第k个输出。对于多类问题,只有在输入对应类的输出节点时,输出才为正,其他类的位或者结点为零或者负数,这个问题主要取决于输出层的激活函数,sigmoid为0,tanh就是-1。

由于在全部的训练集误差表示的是每个训练样本误差的总和,所以先考虑对一个样本的反向传播(BackpropagationPass)。因此对于第n个样本的误差,可以表示为:

传统的全连接层中,需要根据BP规则来计算代价函数E对于网络的每个权值的偏导数。公式里用I来对应当前层,因此当前层的输出可以表示为:

输出激活函数f(.)可以有许多种,但是一般是sigmoid函数和双曲线正切函数这两种。sigmoid是将输出压缩成[0,1],因此在输出平均值时通常是趋于0。所以如果将训练数据进行归一化成零均值与方差为1,那么可以在梯度下降的时候增加收敛性。双曲线正切函数对于归一化数据集也是不错的选择。

3.2反向传播

反向传播回来的误差,可以用来当做每个神经元的基的灵敏度(sensitivities),也就是误差对基bias的变化率,定义如下:

“o”代表的是每个元素相乘。对于输出层神经元的灵敏度各不一样:

最后,对所有神经元使用delta(即δ)规则进行更新。具体说,就是得到给定的神经元的输入,而后用这个神经元的dehe进行缩放。用向量形式表示就是对于第L层,误差对该层组合为矩阵的每个权值的导数是该层的输入(上一层的输出)与该层的灵敏度(把该层的每个神经元的δ组合成向量形式)的叉乘。然后用获得的偏导数乘以负学习率得到该层神经元的权值更新:

相对于bias基,其更新表达式一样。相对于每一个权值(W)ij,都会有相对应的特定的学习率ηij。

4卷积神经网络的参数训练

本文卷积神经网络的训练是基于Pvthon、矩阵计算numpy、开发工具theano和图像库PIL开发,采用的CNN模型类似LeNet5的模型,使用的数据库是纽约大学一个较小的人脸数据库Olivetti Faces,由40个人,每人10张共400张图片构成,每张图片灰度级为8位,每个像素其灰度大小在0-255之间。实验实现人脸识别功能时,模型的误差降低到了5%以下。

4.1样本分类

在运行CNN算法之前,需要用PIL先把图片转化成数组,然后进行图片的分类。一般我们会将原始数据分成三类,训练数据(training_set)、验证数据(validation_set)0、测试数据(test-ing_set),样本数量分别为320、40和40,它们的label为0-39,对应的是40个人。

4.2基本构件的准备

要组建CNN模型,必须先定义LeNetConvPoolLayer(卷积+子采样层)、InnerProductLayer(隐含层)、LogisticRegression(输出层)这三种layer。本文训练的实现模型使用的是LeNet5,有两个卷积层,每个卷积层后面跟着一个子采样层,代码中将卷积层和子采样层结合在一起,在卷积后的输出直接作为子采样层的输入,因此没有添加偏置b以及通过sigmoid函数映射,往后还有一个全连接层和采用softmax回归的输出层。

4.3组建模型,设置优化算法

模型是一个串联结构,用定义好的Layer去组建,上一层的Layer的输出后接下一层Layer的输入。

模型组建好后,需要使用优化算法求解,优化算法采用的是批量随机梯度下降算法(MSGD),需要定义其一些要素,包括:代价函数,参数更新规则,训练、验证、测试模型。

优化算法的基本要素定义的下一步是训练模型,训练过程有训练步数(epoch)设置,每一步会遍历所有训练数据,也就是本次训练的320个人脸图片。还需要设置迭代次数,一次迭代(iter)会遍历一个批次(binch)里的所有样本,批次由自己具体设置。

4.4参数设置

代码中可以设置的参数包括:

1)学习速率(1earning_rate):非常重要的一个参数,是运用SGD算法时梯度前面的系数,如果设得太大可能算法永远都无法优化,太小会让算法优化太慢,并且有可能会掉入局部最优。

2)批次大小(batch_size):将数据输入模型是按批次的,然后计算这个批次所有样本的平均损失,也就是代价函数是所有样本的平均。因此批次的大小也会影响到对模型的优化程度和速度。

3)训练步数(n_epochs):遍历训练集的次数。

4)卷积层的卷积核个数(n_kerns):卷积核的个数代表特征的个数,卷积核的个数越多提取的特征就越多,可能最后分类会越准确。但是如果卷积核太多,会增加参数的规模和计算复杂度。

5)池化大小(pool_size):这里采用的是最大池化方法来选取图像区域的最大值来作为该区域池化后的值,比如(2,2)为选取区域2*2的像素中的最大值。

由于采用的数据集并不大,本次训练将学习速率调成0.05,批次大小设置成40,训练步数为200,第一个卷积层的卷积核个数为5,第二个为10,池化大小为(2,2)。

4.5实验结果

如图4所示,最后测试是以整张图400张人脸作为输入,得出结果后跟其对应的label进行对比,结果有5个人物识别错误。由于实验的数据集不大,有可能模型过拟合,不过模型内的训练的效果比较好。

5结束语

详细地介绍了深度学习的历史由来和近几年研究成果,卷积神经网络是为识别二维图像矩阵而设计的多层感知机,它相比于其他神经网络,卷积神经网络的优点是可以直接以图像的二维矩阵直接作为输入,通过训练样本数据进行自主学习,隐式获得图像抽象的特征表达。它的神经元之间连接是非全连接,且统一特征映射神经元之间权值是共享的,降低了模型的复杂度,更利于学习。池化层的操作增强卷积神经网络的鲁棒性,使其可以接受图像一定情况下的畸变。全连接的算法推导解释了如何将长的向量连接起来并传给输出层的。最后在做实验的时候,通过调参后获得小数据集下一个不错的测试结果。

上一篇:有点儿淡然有点儿咸 下一篇:陈更:工科博士的诗词生活