**计算机系统的介绍
文章目录
一 概要
摘 要:手写字符识别技术作为OCR的一个重要分支,其综合了数学图像处理和机器学习等多方面的知识,已经逐渐成为计算机智能化的重要技术。由于Python在对机器学习处理有着先天优势,所以市面上大多是用Python实现的。本文将使用JavaScript语言,采用卷积神经网络算法,从其原理和结构开始一步步实现对手写数字的识别。通过MNIST数据集对模型进行训练,经过对待训练(识别)的图片预处理,特征提取,分类等操作,实现对手写数字测试集的识别并有着95%以上的识别准确率。最终打包成APK,作为APP在手机上运行。
关键词:机器学习;卷积神经网络;手写数字
二、绪论
1.1.研究背景与意义
1.1.1.研究背景
1.1研究背景与意义
在如今快速发展的数字时代,目前市面上大多是针对印刷字符识别的软件和应用,目前还没有一种商业上的应用或软件可以用于手写字符识别。字符识别处理信息可以分为两类:一类是文字信息,主要是文字或印刷供各国使用的文本信息,如:英文、汉字等文本信息,目前在印刷体识别技术方面已经趋于成熟,诞生了很多商业识别软件。二是数据信息,主要是由阿拉伯数字和其他特殊符号(如电话号码、车牌号、邮政编码等)组成的数字和统计数据,对手写数字的识别就是处理这些信息的核心。手写数字识别研究的难点在于:第一,不同数字的字形差异不大,这就使得很难区分一些数字;第二,不同人的书写风格迥异,书写相同数字的方式也不一样。在实际使用过程中,由于各种因素的影响,手写输入的识别准确率往往会低于印刷体字符。因此,对手写数字识别的研究具有重要的现实意义,如果研究成功并投入使用,未来将会产生巨大的经济效益和社会效益。
二、手写数字识别技术分析
2.1 手写数字识别过程
通常情况下,在让图片正式进入模型的输入层之前,我们会先将图片经过一些方式进行预处理。经过预处理之后,代表图片的矩阵数据便进入输入层,输入的数据会和相应的卷积核进行运算并加上一定量的偏置,卷积层的卷积核会提取图片的边缘等原始信息,然后经过激活函数处理再经由池化后便流入下一层。除去输入层和输出层,中间的所有层我们称之为隐藏层。隐藏层的数量并不固定,需要根据实际情况进行选择才能达到理想效果。通常隐藏层与输出层之间采用全连接方式,通过分类器输出最终结果。损失函数将输出结果和标准值进行某种运算,最终经由误差反向传播法反过去不断更新权重参数和偏置,从而让模型不断地学习。这个过程称之为训练,一个好的模型需要经过大量数据训练后才能够达到理想效果。当然这其中还有学习率,参数更新方法,权重初始值等参数需要进行设置,本文会慢慢逐一进行说明。
2.1.1 图片预处理
由于不同人的手写体风格迥异,大小不一,以及在图像获取中受外界环境影响,最终使图像的清晰度和完整性降低,这会极大影响识别的准确度。所以通常会将图像经过一系列的预处理之后再将图像输入。图片预处理的首要目的是消除图像中一些无关紧要的信息,保留有效信息,从而提高后面特征提取和识别的可靠性。这其中包括噪声消除,图像二值化,倾斜校正等一系列图像预处理方法。
2.1.2 特征提取
(1) 特征是一个物体与其它物体相区分的特征或特征,或者它们的集合。特征是指对可以提取的数据进行处理,并具有一定的属性。就图像而言,任何一张图片都可以与其它类别的图片相区分,在这些图像的亮度、边缘、纹理、色彩等方面,都是视觉上的。有的特征是由矩阵、直方图等进行转换和处理来获得的。
(2)要让电脑“理解”图像,就必须从影像中抽取出一些“非图像”的信息,如数值、矢量等。这个步骤被称为“特征抽取”,而这种“非图像表达”就是“特征”。利用这种特性,我们可以让电脑学会如何去提取和辨认它们,让它们拥有辨认图片的能力。
(3)图像识别实际上是一个分类的过程,为了确定一个图像属于哪一类,我们需要将它与其他不同的图像类别区分开来。这就要求所选择的特征不仅要很好地描述图像,而且更重要的是,要区分不同类型的图像。因此在本文中,我们提出了一种基于卷积神经网络(CNN)的多类图像识别方法。卷积神经网络其简单的提取方法和同时进行特征提取与分类器的优点,在图像识别领域中得到了广泛的应用。
2.1.3 分类器
手写数字识别最后一步是分类器识别,根据之前对图像的特征提取,将图像划分到已有类别中。由于数字只有0~9十种,因此只需要划分十个类别。卷积神经网络的常用分类算法有逻辑回归和softmax回归。前者常用于处理二分类问题,对处理非线性数据较为麻烦。由LeCun等人于1998年提出的经典神经网络模型LeNet-5就采用了后者来进行分类,使得在手写数字识别这种多分类问题取得了较好的识别效果和更优性能。
2.2激活函数
2.2.1 什么是激活函数
激活函数是在人工神经网络中运行在神经元上并将神经元的输入端映射到输出端的函数。引入激活函数的目的是为了增加神经网络模型的非线性,如果没有激活函数,每个神经元层都是来自上层输入的线性函数,无论神经网络有多少层,输出都将是输入的线性组合,神经网络也就失去了仿真的意义。通过加入激活函数,神经元可以逼近任何非线性函数,由此神经网络才能够应用于许多非线性模型。
2.2.2 Sigmoid函数
Sigmoid函数是机器学习中常见的激活函数之一。Sigmoid函数用于隐藏层神经元输入,取值范围在0到1之间,可以将一个实数映射到0到1的区间,其函数图像具有很好的对称性,常用于二分类的场景中。Sigmoid函数表达式如公式(1)所示。
其图像如图1所示。
当Sigmoid 函数输入的值趋于正无穷或负无穷时,梯度会趋近零,从而出现梯度消失问题,而在0附近梯度则很大,导致梯度爆炸的问题。Sigmoid函数输出恒为正值,这会导致权值更新时只能朝着一个方向更新,进而影响收敛速度。
2.2.3 Relu函数
线性整流 (Relu) 函数也是机器学习中常用的一种非线性激活函数。Relu函数比较简单,它只对输入信号值大于0的部分进行响应,而对于小于0的信号则被直接屏蔽了,这样可以提高学习精度。其表达式如公式(2)所示。
其图像如图2所示
图2 Relu函数图像
梯度消失是机器学习中一个很重要的问题,在进行反向误差传播时,各个层都要乘以激活函数的一阶导数,梯度每向后传递一层就会衰减一层,而在神经网络模型层数较多时,梯度就会不断衰减直到消失,使得网络训练收敛得越来越慢。相比于上述的Sigmoid函数,Relu函数则避免了梯度消失和梯度爆炸的问题,从而能够更加有效的实现梯度下降和反向传播,训练速度也能够快很多。
三、卷积神经网络的结构和模型设计
3.1 卷积神经网络概述
卷积神经网络(Convolutional Neural Networks, CNN)是一种具有深度结构和卷积运算的前馈神经网络,被广泛应用于计算机视觉和图像识别等领域。一个完整的卷积神经网络通常包括卷积层、池化层、全连接层等。
3.2 卷积层
卷积神经网络中的每个卷积层(Convolutional layer)由多个卷积单元组成,初始值是经过某种方式随机生成的,通过反向传播算法逐渐修正原始随机值的参数。由于在每一层卷积层上采用了不同的神经元数目,所以该方法具有很高的效率和较强的泛化能力。同时还可以根据需要对其进行动态调整。卷积运算的目的是要从输入图像中提取出相应的特征。第一层卷积层可能只能提取低层次的特征,例如边缘和线条。随着层数的增加,神经网络就可以从这些低层次的特征中提取其他更复杂的特征。
3.2.1 卷积运算
在介绍卷积运算之前,我们需要先介绍一下卷积核,卷积运算就是在输入图像和卷积核之间进行的一种矩阵运算。卷积核为一个用户自定义大小的矩阵,在对只有一个通道(即黑白图像)的图像进行处理时,卷积核为一个二维矩阵;而在对RGB彩色图像进行图像处理时,卷积核为一个三维矩阵,此时我们更倾向于称它为滤波器。卷积核具有局部特性,即它只关注图像的局部特征,局部的程度取决于卷积核的大小,并且卷积核的数量越多,能够提取的特征数量也就越多。
卷积运算就是对卷积层进行处理,相当于图像处理的“滤波器运算”。如图3所示,卷积运算对输入数据应用卷积核。
图3 卷积运算
在本例中,输入数据是一个4x4的矩阵,卷积核是一个3x3的矩阵,经过卷积运算后得到的结果是一个2x2的矩阵。对于输入数据,卷积运算以一定间隔滑动卷积核的窗口(即图中输入数据中3x3的灰色矩阵)并应用,将各个位置卷积核和输入数据中对应元素相乘然后累加起来,并将结果保存到输出结果的对应位置。经过从左至右,从上至下都运算一遍后,即可得到相应的运算结果。与全连接神经网络一样,卷积神经网络除了卷积核(权值)外,也存在一个偏置,如图4所示,但是通常偏置是一个数,会被加到卷积运算结果矩阵中的每一个元素上。
图4 卷积运算加上偏置后的过程
3.2.2 填充和步幅
在进行卷积层的处理前,由于每次进行卷积运算都会缩小空间,为了调整输出的大小,则需要对输入数据四周填入一些固定的数据,通常来说填入0,即为填充(padding)。如图5所示,为了对4x4矩阵的输入数据应用3x3的卷积核,最终得到的输出数据也是4x4矩阵,所以需要预先对输入数据填充一圈0,即图中淡蓝色部分。值得注意的是,图5是将填充设为1,因此输入数据在经过卷积运算之后可以保持空间大小不变传递给下一层。此外也可以设为2、3等其他数值,填充设置得越大,最终得到的输出数据也越大。
图5 卷积运算的填充处理
应用卷积核的位置间隔称为步幅(stride),之前我们所使用的例子都是步幅为1的卷积运算。如图6所示我们将步幅设置为2,则应用卷积核的窗口的间隔变为两个元素。因此,当步幅设置得越大时,经过卷积运算后的最终输出数据空间则会越小。实际应用时应根据需求合理设置填充和步幅的大小,这样才能取得理想的结果。
图6 步幅为2的卷积运算
四、卷积神经网络的训练与优化
4.1全连接神经网络和卷积神经网络对比
在全连接神经网络中,相邻层的神经元全部连接在一起。全连接层会把输入拉成一个列向量,当输入为28x28像素的单通道图像时,那么输入层就将有784个神经元,输入层与下一层权重个数取决于下一层神经元个数,假设下一层有100个神经元,这是权重个数将达到78400个,这个计算量无疑是巨大的。 这还只包括两层神经网络,当网络结构更加复杂时,这个参数将会更多。参数过多不仅会使计算速度变慢,导致网络模型训练学习时间加长,而且还会导致过拟合的问题。
与全连接神经网络不同,卷积神经网络作为深度学习的一个代表算法模型,通过充分利用局部相关性和权值共享的思想,极大地减少了网络的参数量,从而提高训练效率,更容易实现超大规模的深层网络[8]。
在实际应用中经常使用多层卷积,然后通过连接若干层全连接层输出结果。多层卷积的目的是因为单层卷积层学习到的特征通常是局部的,随着层的数量增多,学习到的特征就越全局化。但是卷积层的数量也不是越多越好,这样会导致运算量的急剧增加,严重影响训练速度。而全连接层的目的是通过学习到的特征向量将图像进行正确分类。
4.2卷积神经网络的训练过程
在定义好卷积神经网络模型之后,我们还需要对网络模型中的一些参数进行初始化,这称之为超参数设置。其中包括卷积核的权重,全连接层中的神经元权重,对于偏置通常采用0进行初始化。值得注意的是,我们并不能将权重初始值设置为0,因为这将导致模型无法正确学习,在此我们采用He初始值初始化权重,后面会介绍原因。
我们采用的是MNIST数据集上的图像对模型进行训练,其中包括55000张训练集和10000张测试集,均为28x28像素的单通道图像,测试集是用来模拟拟合的数据样本,也就是用来训练样本。通常情况下,我们从训练集提取一定数量的图像作为验证集,这些图像可以用来调整超参数并初步评估模型的泛化能力,通常是在模型的模型迭代训练期间,以验证当前模型最终模型泛化能力(准确率、召回率等)。
卷积神经网络使用反向传播算法对网络模型完成监督训练工作,我们采用的网络模型的整个训练学习过程分为两个部分。
(1)第一阶段:正向传播:
(a)构建相应的网络模型,对各层网络权值参数进行初始化,确定学习率和最大迭代次数,选取相应的训练集和测试集。
(b)从训练集中随机选取出一个图像数据并输入网络,通过各层传播得到实际的输出向量t如公式(15)所示。
(15)
(2)第二阶段,反向传播:
(a)用设置好的误差损失函数计算出实际输出向量t和标签值one-hot编码对应的向量y的损失值。
(b)反向传播并使用梯度下降法计算各层损失函数对参数(权重和偏置)的偏导数,从输出层逐层向后传播,不断更新修正参数直到达到之前设置的迭代次数时停止训练。
卷积神经网络是仿生物神经系统的运算模型,通过不断的训练和学习,计算机可以模拟生物的大脑识别信息。网络模型由卷积层、池化层和全连接层组成,通过中间层和网络模型层之间的连接,网络在开始时以一定的输入响应预期的输出结果。 目前,卷积神经网络已经广泛应用于模式识别、机器视觉、图像处理等领域中,具有广泛的应用前景。卷积神经网络作为一个复杂且高度非线性系统,其结构非常复杂。 整个网络模型需要大量的计算,通过不断训练学习和修正参数,神经网络通过这种自适应学习和训练的过程产生“记忆”,使得在训练完成之后,随意给出一张相应格式的图像数据,网络模型便会给出对应的输出值。为避免每一次使用模型识别数据都得重新训练而浪费大量时间,我们可以把训练完成之后对应的参数(权重和偏置项)保存起来,下次使用时网络模型直接从导入保存好的参数,从而避免了繁杂且漫长的训练过程。这便构造了一个成功的卷积神经网络模型。
总结
本文介绍了现今用于手写数字识别的相关技术,当前国内外发展状况及其应用领域。一步步分析了手写数字识别的整个过程和卷积神经网络的基本结构,实现了将卷积神经网络应用于手写数字识别上,并基于卷积神经网络模型基础上不断训练优化,其中包括采用Relu函数替代Tanh函数作为激活函数;采用Adam方法更新权值参数;通过添加Dropout层来抑制过拟合;采用He初始化权值参数等等。通过HTML5+JavaScript的方式实现并最终打包成APP在手机上运行。最终实验数据表明,本文所介绍网络模型结构以及优化方式具有良好的可靠性和稳定性,最终对MNIST测试集的手写数字图像的识别精度达到了97%,这为我们以后对手写体的研究提供了很好的途径。
五、 文章目录
目 录
1 绪论 1
1.1研究背景与意义 1
1.2 国内外研究现状 2
1.3 本文结构安排 3
2 手写数字识别技术分析 4
2.1 手写数字识别过程 4
2.1.1 图片预处理 4
2.1.2 特征提取 4
2.1.3 分类器 5
2.2激活函数 5
2.2.1 什么是激活函数 5
2.2.2 Sigmoid函数 5
2.2.3 Relu函数 6
2.3 输出层的设计 7
2.3.1 softmax函数 7
2.3.2 输出层神经元个数 7
2.4 损失函数 7
2.4.1 损失函数的作用 7
2.4.2 均方误差损失函数 7
2.4.3 交叉熵误差损失函数 8
3 卷积神经网络的结构和模型设计 8
3.1 卷积神经网络概述 8
3.2 卷积层 8
3.2.1 卷积运算 8
3.2.2 填充和步幅 9
3.3 池化层 10
3.3.1 最大池化 11
3.3.2 平均池化 11
3.4 误差反向传播算法 11
3.5本文所采用的网络模型结构 14
4 卷积神经网络的训练与优化 15
4.1全连接神经网络和卷积神经网络对比 15
4.2卷积神经网络的训练过程 15
4.3本文对卷积神经网络的优化 17
4.3.1 使用Adam方法更新参数 17
4.3.2 应用Dropout抑制过拟合 18
4.3.3 对超参数进行优化 18
5 手写数字识别实验结果与分析 19
5.1基于卷积神经网络的数字识别实验结果 19
5.2项目打包与运行效果展示 20
6 总结与展望 23
6.1 工作总结 23
6.2 展望 23