基于TensorFlow框架的手写数字识别

(整期优先)网络出版时间:2023-04-19
/ 3

基于TensorFlow框架的手写数字识别

胡晨,李嘉杰,许元庆 ,指导老师:祁颜荣

山东协和学院  山东济南  250107

摘要:手写识别是一种应用在手机和平板电脑输入中的一种常见输入方式,目前国内已经有很多开源的机器学习平台可以方便的进行构建神经网络对手写数字进行识别。如Google公司的TensorFlow和百度的PaddlePaddle(飞浆)。本文通过搭建CNN卷积神经网络,利用python编程技术,使用TensorFlow框架并结合MNIST标准数据集对模型进行训练于评估,从而达到对手写数字的识别

关键词:CNN卷积神经网络;TensorFlow;手写数字识别;数据集

一.Tensorflow框架与MNIST数据集

  1. Tensorflow框架

Google公司的Tensorflow深度学习框架是目前较为常用的深度学习平台。Tensorflow框架的推出使人工智能的开发更加便捷。Tensorflow支持多种CPU和GPU计算,可以很快的将神经网络计算部署到个人计算机和各类服务器上,也可支持多种模型训练。例如卷积神经网络和递归神经网络。在机器学习领域中使用的最常见的编程语言是python,python这一编程语言本身就集成了很多跟机器学习相关的第三方库,此外还有很多支持机器学习使用的库也可以很方便的导入到python中。利用pip install tensorflow命令就可以将Tensorflow集成到python中。

  1. MNIST数据集

MNIST是一个非常有名的手写体数字识别数据集(手写数字灰度图像数据集),在很多资料中,这个数据集都会被用作深度学习的入门样例。 

MNIST数据集是由0-9的数字图像构成的。训练图像有6万张,测试图像有1万张。MNIST数据集是MNIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据。由250个不同的人手写而成。 

每一张图片都有对应的标签数字,训练图像一共有60000张,供研究人员训练出合适的模型。测试图像一共有10000张,供研究人员测试训练的模型的性能。  

这些手写图片都是28*28像素,灰度图像。

2fb369644b335831de2150f2123fdb2a

但是它们并不是作为图像文件存储的,而是28*28的二维数组中。数组中的每个元素对应数组中的每个像素。 

ab85ed2b3683e3b550b3c0705506a692

二.CNN卷积神经网络

0c469c8c04864cd22bfc038a90418c51

针对于CNN,其实呢,抛去那些晦涩难懂的概念,细说CNN的构成就那么几层罢了,卷积层、激活函数、池化层、全连接层。我们这里打算仅搭建四层,进行这个让我们的电脑成为一个“小超人”这个神圣的任务。第一层:卷积层 、第二层:卷积层、 第三层:全连接层、 第四层:输出层。那么我们建立这些层的原因是什么呢?这要从卷积神经网络的原理说起,即对图片的特征进行提取,我们现在第二个卷积层窗口大小为5×5,对32张图像求卷积产生64个特征图,参数个数是5×5×32×64=51200个权值加上64个偏置。

池化计算是在卷积层中进行的,使用2×2,步长为2的池化窗口做池化计算,池化后得到64张7×7的特征图。特征图长宽都变成了之前的1/2。

第三层是全连接层,为池化层的结果做池化计算,池化后得到特征图。

第四层是输出层,输出预测值。

特征图数量越多说明卷积网络提取的特征数量越多,如果特征图数量设置得太少容易出现欠拟合,如果特征图数量设置得太多容易出现过拟合,所以需要设置为合适的数值。

三.实例构建过程

python3.9是目前python版本中较为稳定的版本,Tensorflow2.9.1是Tensorflow目前的最新版。所以本实例采用python3.9+Tensorflow2.9.1。操作系统为win10家庭版,计算机CPU为8核的AMD Ryzen 5 4500U。实例构建分为四个步骤:第一步在python库中导入Tensorflow及相关工具包,第二步加载MNIST数据集并对数据集进行预处理,第三步构建神经网络模型训练数据,第四步对预预测的图片进行预测。

  1. 在python库中导入Tensorflow

在python3.9中建立工程并通过import tensorflow将Tensorflow导入到python中,为了方便多维度的矩阵运算及可视化的结果,通过import numpy和import matplotlib将数学库和绘图库也一并导入到python中。但是因为numpy不是python的标准库,所以需要使用指令pip install numpy对其进行安装。

  1. 加载MNIST数据集

在Tensorflow2.9.1下可以直接利用Keras模块加载MNIST数据集,考虑到MNIST数据集加载速度较慢,本实例将下载好的MNIST数据集保存在电脑中加载,并对MNIST数据集60000张训练图片和10000张测试图片进行简单的处理预处理为Tensorflow中的张量(Tensor)。利用Tensorflow中的convert_to_tensor可以较为方便的将python中的数据转换为Tensorflow中的张量(Tensor)。

  1. 构建神经网络模型训练数据
    1. 引入数据集

这里呢,我们引入数据集是一个非常简单的事情,只需要将keras.datasets下的mnist导入即可。

mnist = tf.keras.datasets.mnist

(train_data,train_target), (test_data, test_target) = mnist.load_data()

3.2.数据预处理

这里我们要使用TensorFlow来进行后续操作,所以需先对数据进行预处理。3.2.1 改变数据维度

train_data = train_data.reshape(-1, 28, 28, 1)

test_data = test_data.reshape(-1, 28, 28, 1)

在TensorFlow中,在做卷积的时候需要把数据变成4维的格式,这4个维度分别是:数据数量,图片高度,图片宽度,图片通道数

3.2.2 归一化(有助于提升训练速度)

train_data = train_data/255.0

test_data = test_data/255.0

3.2.3 独热编码

train_target=tf.keras.utils.to_categorical(train_target,num_classes=10)

test_target=tf.keras.utils.to_categorical(test_target,num_classes=10)

3.3.搭建网络

3.3.1 卷积层的搭建

这一层主要是由卷积层+池化层组成,在tensorflow中为我们直接提供了函数。

model.add(Convolution2D(input_shape = (28,28,1), filters = 32, kernel_size = 5, strides = 1, padding = 'same', activation = 'relu')) 

model.add(MaxPooling2D(pool_size = 2, strides = 2, padding = 'same',)) 

3.3.2 第二个卷积层的搭建

model.add(Convolution2D(64, 5, strides=1, padding='same', activation='relu'))

model.add(MaxPooling2D(2, 2, 'same')) #第二个池化层

model.add(Flatten()) #扁平化

3.3.3 第一个全连接层

model.add(Dense(1024, activation = 'relu'))

model.add(Dropout(0.5))

3.3.4 第二个全连接层(输出层)

model.add(Dense(10, activation='softmax'))

3.3.5 编译

model.compile(optimizer=Adam(lr=1e-4),loss='categorical_crossentropy',metrics=['accuracy'])

3.3.6 训练与保存

model.fit(train_data,train_target,batch_size=64,epochs=20,validation_data=(test_data, test_target))

model.save('mnist.h5')

  1. 模型的预测与校验

本实例在进行模型训练的时候,先将迭代次数epoch的值设置为10,然后运行程序中的main.py文件最终得到的结果为训练集损失值loss=0.0203,训练集准确率accuracy=0.9940,测试集损失值val_loss=0.0222,测试集准确率val_accuracy=0.9921

}MJWILKK]SZ5976FB{Z}3CX

但当运行程序中predict.py文件对测试样例进行预测时得到的结果并不准确

Figure_1

于是我们对epoch的值进行不断调整,最终当epoch的值为20的时候训练集损失值loss=0.0074,训练集准确率accuracy=0.9975,测试集损失值val_loss=0.0230,测试集准确率val_accuracy=0.9929。此时可以较为准确的将待测手写体数字进行预测。

]3X$TUW2DPUL53IMEYUI]HE

YL1_WG{2RQIIB_2F5XT%TOT

四.结语

本文通过使用Tensorflow深度学习平台构建两层神经网络进行手写数字的识别学习训练,只要学习率设计合适就能在有限的迭代次数内达到一个很高的正确率,由于本文中的实例所使用的电脑CPU计算性能有限,本实例只设计了两层神经网络,下一步将设计出更深层的神经网络学习系统,将部署到更多的服务器和电脑上进行手写数字识别及各类图形的识别。

【参考文献】

[1]刘宝宝.改进的全卷积神经网络在手写数字上的应用[J].电脑知识与技术,2020,16(35):1-3

[2]李斯凡,高法钦.基于卷积神经网络的手写数字识别[J].浙江理工大学学报(自然科学版),2017,34(3):438-443

[3]茹晓青,华国光,李丽宏,等.基于形变卷积神经网络的手写体数字识别研究[J].微电子学与计算机,2019,36(4):47-51

作者介绍

胡晨(2003-),男,安徽芜湖人,人工智能专业,本科学生

李嘉杰(2003-),男,山西大同人,人工智能专业,本科学生

许元庆(2003-),男,山东济宁人,人工智能专业,本科学