基于卷积神经网络的手写数字识别研究
2022-09-24高春庚孙建国
高春庚,孙建国
(济源职业技术学院 信息工程系,河南 济源 459000)
0 引言
近年来,手写数字的识别是模式识别和人工智能领域的研究热点,是一种利用计算机自动识别手写数字的技术.该技术被广泛应用到邮政编码、财务报表、税务系统数据统计、银行票据等手写数字自动识别录入中[1-2].由于不同的手写者字体不同,对大量的手写数字实现完全正确识别不是一件容易的事情.随着信息化技术的不断发展,人们对自动识别的要求越来越高.因此,研究一种高效且准确的手写数字识别方法有着重要的意义[3-5].
目前常用的手写数字识别方法有人工神经网络、K近邻算法、支持向量机、贝叶斯算法等.这些方法对复杂分类问题的数学表示能力及网络的泛化能力有限,往往不能达到高精度的要求,卷积神经网络的出现为解决这个问题提供了重要途径[4-6].
1 卷积神经网络原理
1.1 卷积神经网络结构
传统多层神经网络的基本组成包括输入层、隐藏层和输出层.卷积神经网络将传统多层神经网络的隐藏层分为多个卷积层(Convolutional Layer)、池化层(Pooling Layer,也叫下采样层)以及激活层,使得神经网络的层数加深.为了实现分类功能,还会设置一个全连接层(Fully Connected Layer, FC Layer)作为最后的输出层,进行损失计算并输出分类结果[7].
图像识别的卷积神经网络模型如图1所示.最左边是输入图像,以若干个数据矩阵的形式输入;接着是卷积层,卷积层是卷积神经网络特有的,卷积层可以加上激活函数;在卷积层后面是池化层,池化层没有激活函数.“卷积层+池化层”的组合结构可以在隐含层出现很多次,这个次数根据模型的需要确定.网络结构中可以灵活地使用“卷积层+卷积层”组合,或者“卷积层+卷积层+池化层”组合,这些结构在构建模型时没有限制.最常见的卷积神经网络都是若干“卷积层+池化层”的组合,在“卷积层+池化层”后面是全连接层.
图1 卷积神经网络结构图
卷积神经网络的优点是无需人工提取图像特征.图像经过输入层输入卷积神经网络中,卷积层中的卷积核对输入图像进行卷积运算,生成对应的特征图(Feature Map).下采样层对上层卷积后生成的特征图进行局部特征提取,生成子采样特征图.使用多个卷积层和池化层提取图像特征,可以有效避免人工特征提取的局限性和主观性,使模型对旋转、扭曲变形的图像有较好的适应性,在图像识别之前省去预处理过程,可以简化图像识别的过程.卷积神经网络在图像识别、自然语言处理等领域有广泛的应用[7].
1.2 卷积层
卷积层由若干个卷积单元(Filter,也叫卷积核)组成,每个卷积单元的参数是在训练阶段通过反向传播算法优化得到.当卷积层的一个卷积核对输入层的不同区域作卷积时,卷积核的权值不变,即一个卷积核只用来提取前一层网络中不同位置的同一个特征[8],这样不仅减少网络参数,而且可以使整个网络获得较好的鲁棒性.通过卷积单元在图像上平移并进行卷积操作,使得图像上每一个像素点的值与卷积核的乘积加入偏置,再经过激活函数的运算,就可以得到输入图像的一个特征映射[9-10],卷积原理如公式(1)所示:
(1)
卷积层的卷积过程如图2所示.假设输入图像的大小为5×5,卷积核大小为3×3,步长为1,经过卷积运算后,得到大小为3×3的特征映射图.
图2 卷积运算示意图
1.3 池化层
池化层也叫下采样层.池化实际上是一种降采样,主要是对前面卷积层提取出的特征图进行二次特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量,从而达到减少运算量的目的,并且可以避免过拟合.池化层计算公式如公式(2)所示:
(2)
图3 最大池化示意图
1.4 全连接层
卷积神经网络中,在最后一层卷积层与输出层之间,加入全连接层.该层将卷积层最后的输出转化为一维数据序列,数据序列中的每个元素对应一个神经元,并与下一层的各个神经元通过权值建立连接,其结构如图4所示.全连接层主要对特征进行重新拟合,可以减少特征信息丢失,再使用Softmax函数进行分类[14-15].
图4 全连接结构
2 本文网络结构
根据以上分析,本文所设计的卷积神经网络结构如图5所示.输入Image代表输入图像,网络主要包括两个卷积大层,在每一个卷积大层分别有一个卷积层、一个激活层和一个池化层.为方便分类,在隐藏层和输出层之间有一个全连接层,在两个卷积大层中激活函数都选用ReLU,其计算公式如式(3).由于ReLU函数分段特性,相比其他激活函数,计算速度大大增加,且该函数没有指数运算,收敛速度比较快.
(3)
图5 本文设计的网络结构
3 基于TensorFlow的模型实现
本实验基于MNIST数据集进行.该数据集包含0~9的很多图片,分为训练数据集和测试数据集两部分.
conv1表示第一个卷积层,也是神经网络模型的输入层.把输入图像(input_image)和卷积核(conv1_weights)进行卷积运算,再加上偏置量(conv1_bias).在MNIST数据集中,每幅图像均为黑白图片,高度和宽度都是28像素,每幅图像都是[1,784]的矩阵,因此需要使用reshape对图片形状进行修改,修改为[-1,28,28,1]的四维向量.其中-1表示每次输入的图像数量,第2维、第3维的28分别表示图像的高度和宽度,第4维的1表示图像的通道数,每幅图像均为黑白图像,因此通道数是1.conv1_weights是需要初始化的模型参数,即网络的权值,用变量存储,因为第一层设计32个filter,每个filter大小为5*5,通道数是1,因此在初始化conv1_weights时指定其形状为[5,5,1,32];卷积运算时步长为1;conv1_bias代表偏置,因为有32个filter,每个filter带一个偏置,因此偏置的形状为[32];第一卷积层的输出结果conv1用ReLU函数激活.
input_image=tf.reshape(tensor=x,shape=[-1,28,28,1])
conv1_weights=tf.Variable(initial_value=tf.random_normal(shape=[5,5,1,32],stddev=0.01))
conv1_bias=tf.Variable(initial_value=tf.random_normal(shape=[32],stddev=0.01))
conv1=tf.nn.conv2d(input=input_image,filter=conv1_weights,strides=[1,1,1,1],padding="SAME")+conv1_bias
relu1 = tf.nn.relu(features=conv1)
pool1表示第一个池化层.relu1是上层激活层的输出,作为第一池化层的输入,形状为[None,28,28,32],None代表输入的图像数量.池化层的窗口大小为2*2,步长为2,采用最大池化,经过池化后输出形状为[None,14,14,32].
pool1 = tf.nn.max_pool(value=relu1,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
conv2表示第二个卷积层,其输入是上一池化层的输出.该层设计64个卷积核,每个卷积核大小均为5*5,因此在初始化conv2_weights时指定其形状为[5,5,32,64],步长为1,零填充padding=“SAME”.有64个filter,每个filter带一个偏置,因此偏置的形状为[64],输入特征图经过conv2层卷积后,输出图像的形状为[None,14,14,64].第二卷积层的输出结果conv2用ReLU函数激活.
conv2_weights=tf.Variable(initial_value=tf.random_normal(shape=[5,5,32,64],stddev=0.01))
conv2_bias=tf.Variable(initial_value=tf.random_normal(shape=[64],stddev=0.01))
conv2=tf.nn.conv2d(input=pool1,filter=conv2_weights,strides=[1,1,1,1],padding="SAME")+conv2_bias
relu2=tf.nn.relu(features=conv2)
pool2表示第二个池化层.relu2是上层激活函数的输出,作为第二池化层的输入,形状为[None,14,14,64],池化层的窗口大小为2*2,步长为2,采用最大池化,经过池化后输出形状为[None,7,7,64].
pool2=tf.nn.max_pool(value=relu2,ksize=[1,2,2,1],strides=[1,2,2,1],padding="SAME")
fc表示全连接层.全连接层的输入是2维数组,因此需要将上层的输出转换为2维数组,即矩阵[1,7*7*64];该模型输出是10个数字的分类,因此输出形状为[1,10].
fc_x=tf.reshape(tensor=pool2,shape=[-1,7*7*64])
fc_ weights =create_weights(shape=[7*7*64,10])
fc_ bias =create_weights(shape=[10])
fc=tf.matmul(a= fc_x,b= fc_ weights)+ fc_ bias
4 实验结果与分析
本文使用Windows10操作系统,计算机基本配置为Intel Core i5-9400处理器,主频为2.9 GHz,4G DDR3内存,使用的软件平台为Python3.6和TensorFlow1.8.0.
在神经网络实验中,不同的优化算法和学习率对实验结果都会产生很大影响.目前对优化算法的选择还没有达成共识,也暂无有效的算法来计算初始学习率.通常选择不同的优化算法,调整其学习率,通过结果对比,得出合适的模型参数.针对本文模型,分别选用了GradientDescentOptimizer、MomentumOptimizer和Adam Optimizer 3种不同的优化算法,测试其在不同学习率时的准确率和损失,共训练1 000次,每训练10次收集一次准确率和损失值,结果如表1所列.
表1 不同学习率下3种优化算法对比
从以上实验结果看出,在选用GradientDescentOptimize优化算法时,当学习率Learning rate=0.001时,模型无法收敛;用AdamOptimizer优化算法时,当学习率Learning rate为0.1和0.01时模型无法收敛;当学习率Learning rate=0.001时,训练次数超过200次后,准确率在99%以上,损失接近0.结果表明,本文所述模型在选用AdamOptimizer优化算法,初始学习率为0.001时,该模型能够达到较好的识别效果.
为验证本模型的有效性,将本文模型和传统的全连接网络模型进行对比,两种模型在相同数据集上的准确率和损失如表2所列.
表2 本文模型和全连接网络模型对比
从表2中可以看出,本文所述网络模型在训练次数到达190次时准确率即可接近100%,损失降到0.05左右,而全连接网络模型在训练到200次时准确率才到达94%,损失降到0.4左右.因此本文所建立的网络模型较传统模型收敛速度更快.
5 结语
以手写数字自动识别为研究对象,解决了传统多层全连接神经网络模型权值参数过多、计算量大的问题,文中设计了一种新的网络模型,该网络模型基于卷积神经网络,包括两个卷积层、两个激活层、两个池化层和一个全连接层;对比分析了几种常用的优化算法在选择不同学习率时的识别效果,选用具有自适应学习率的优化算法.在MNIST数据集上进行训练与测试,得到手写数字自动识别模型.实验结果表明,本文所构建的手写数字识别模型性能优于传统多层神经网络模型,识别准确率高,有较好的鲁棒性.