Python MNIST手写体识别详解与试练


Posted in Python onNovember 07, 2021

【人工智能项目】MNIST手写体识别实验及分析

Python MNIST手写体识别详解与试练

1.实验内容简述

1.1 实验环境

本实验采用的软硬件实验环境如表所示:

Python MNIST手写体识别详解与试练

在Windows操作系统下,采用基于Tensorflow的Keras的深度学习框架,对MNIST进行训练和测试。

采用keras的深度学习框架,keras是一个专为简单的神经网络组装而设计的Python库,具有大量预先包装的网络类型,包括二维和三维风格的卷积网络、短期和长期的网络以及更广泛的一般网络。使用keras构建网络是直接的,keras在其Api设计中使用的语义是面向层次的,网络组建相对直观,所以本次选用Keras人工智能框架,其专注于用户友好,模块化和可扩展性。

1.2 MNIST数据集介绍

MNIST(官方网站)是非常有名的手写体数字识别数据集。它由手写体数字的图片和相对应的标签组成,如:

Python MNIST手写体识别详解与试练

MNIST数据集分为训练图像和测试图像。训练图像60000张,测试图像10000张,每一个图片代表0-9中的一个数字,且图片大小均为28*28的矩阵。

  • train-images-idx3-ubyte.gz: training set images (9912422 bytes) 训练图片
  • train-labels-idx1-ubyte.gz: training set labels (28881 bytes) 训练标签
  • t10k-images-idx3-ubyte.gz: test set images (1648877 bytes) 测试图片
  • t10k-labels-idx1-ubyte.gz: test set labels (4542 bytes) 测试标签

1.3 数据预处理

数据预处理阶段对图像进行归一化处理,我们将图片中的这些值缩小到 0 到 1 之间,然后将其馈送到神经网络模型。为此,将图像组件的数据类型从整数转换为浮点数,然后除以 255。这样更容易训练,以下是预处理图像的函数:务必要以相同的方式对训练集和测试集进行预处理:

之后对标签进行one-hot编码处理:将离散特征的取值扩展到了欧式空间,离散特征的某个取值就对应欧式空间的某个点;机器学习算法中,特征之间距离的计算或相似度的常用计算方法都是基于欧式空间的;将离散型特征使用one-hot编码,会让特征之间的距离计算更加合理

2.实验核心代码

(1)MLP感知器

# Build MLP
model = Sequential()

model.add(Dense(units=256,
                input_dim=784,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=128,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=64,
                kernel_initializer='normal',
                activation='relu'))
model.add(Dense(units=10,
                kernel_initializer='normal',
                activation='softmax'))

model.summary()

(2)CNN卷积神经网络

# Build LeNet-5
model = Sequential()
model.add(Conv2D(filters=6, kernel_size=(5, 5), padding='valid', input_shape=(28, 28, 1), activation='relu')) # C1
model.add(MaxPooling2D(pool_size=(2, 2))) # S2
model.add(Conv2D(filters=16, kernel_size=(5, 5), padding='valid', activation='relu')) # C3
model.add(MaxPooling2D(pool_size=(2, 2))) # S4
model.add(Flatten())
model.add(Dense(120, activation='tanh')) # C5
model.add(Dense(84, activation='tanh')) # F6
model.add(Dense(10, activation='softmax')) # output
model.summary()

模型解释

模型训练过程中,我们用到LENET-5的卷积神经网络结构。

Python MNIST手写体识别详解与试练

第一层,卷积层

这一层的输入是原始的图像像素,LeNet-5 模型接受的输入层大小是28x28x1。第一卷积层的过滤器的尺寸是5x5,深度(卷积核种类)为6,不使用全0填充,步长为1。因为没有使用全0填充,所以这一层的输出的尺寸为32-5+1=28,深度为6。这一层卷积层参数个数是5x5x1x6+6=156个参数(可训练参数),其中6个为偏置项参数。因为下一层的节点矩阵有有28x28x6=4704个节点(神经元数量),每个节点和5x5=25个当前层节点相连,所以本层卷积层总共有28x28x6x(5x5+1)个连接。

第二层,池化层

这一层的输入是第一层的输出,是一个28x28x6=4704的节点矩阵。本层采用的过滤器为2x2的大小,长和宽的步长均为2,所以本层的输出矩阵大小为14x14x6。原始的LeNet-5 模型中使用的过滤器和这里将用到的过滤器有些许的差别,这里不过多介绍。

第三层,卷积层

本层的输入矩阵大小为14x14x6,使用的过滤器大小为5x5,深度为16。本层不使用全0填充,步长为1。本层的输出矩阵大小为10x10x16。按照标准卷积层本层应该有5x5x6x16+16=2416个参数(可训练参数),10x10x16x(5x5+1)=41600个连接。

第四层,池化层

本层的输入矩阵大小是10x10x16,采用的过滤器大小是2x2,步长为2,本层的输出矩阵大小为5x5x16。

第五层,全连接层

本层的输入矩阵大小为5x5x16。如果将此矩阵中的节点拉成一个向量,那么这就和全连接层的输入一样了。本层的输出节点个数为120,总共有5x5x16x120+120=48120个参数。

第六层,全连接层

本层的输入节点个数为120个,输出节点个数为84个,总共参数为120x84+84=10164个。

第七层,全连接层

LeNet-5 模型中最后一层输出层的结构和全连接层的结构有区别,但这里我们用全连接层近似的表示。本层的输入节点为84个,输出节点个数为10个,总共有参数84x10+10=850个。

模型过程

初始参数设定好之后开始训练,每次训练需要微调参数以得到更好的训练结果,经过多次尝试,最终设定参数为:

  • 优化器:adam优化器
  • 训练轮数:10
  • 每次输入的数据量:500

LENET-5的卷积神经网络对MNIST数据集进行训练,并采用上述的模型参数,进行10轮训练,在训练集上达到了95%的准确率

Python MNIST手写体识别详解与试练

3.结果分析机器总结

3.1 模型测试以及结果分析

为了验证模型的鲁棒性,在上述最优参数下保存在验证集上性能最好的模型,在测试集上进行最终的测试,得到最终的准确率为:95.13%.

为了更好的分析我们的结果,这里用混淆矩阵来评估我们的模型性能。在模型评估之前,先学习一些指标。

TP(True Positive):将正类预测为正类数,真实为0,预测也为0FN(False Negative):将正类预测为负类数,真实为0,预测为1FP(False Positive):将负类预测为正类数, 真实为1,预测为0。TN(True Negative):将负类预测为负类数,真实为1,预测也为1混淆矩阵定义及表示含义:

混淆矩阵是机器学习中总结分类模型预测结果的情形分析表,以矩阵形式将数据集中的记录按照真实的类别与分类模型预测的类别判断两个标准进行汇总。其中矩阵的行表示真实值,矩阵的列表示预测值,下面以本次案例为例,看下矩阵表现形式,如下:

Python MNIST手写体识别详解与试练

Python MNIST手写体识别详解与试练

3.2 结果对比

并与四层全连接层模型进行对比,全连接层的模型结构如下:

Python MNIST手写体识别详解与试练

其结果如下:

Python MNIST手写体识别详解与试练

Python MNIST手写体识别详解与试练

总之,从结果上来看,最后经过不断地参数调优最终训练出了一个分类正确率在95%左右的模型,并且通过实验证明了模型具有很强的鲁棒性。

3.3 模型的预测

对单张图像进行预测:

Python MNIST手写体识别详解与试练

4 总结

本文通过对卷积神经网络的研究流程分析,提出了一套完整的卷积神经网络MNIST手写体识别流程并也将本文的数据集分类正确率提高到95%的水平;其次,本文构建的模型是具有普适性的,可以稍加改进就应用于不同的数据集进行特征提取及分类。再次,本文在构建模型的过程中综合考虑了计算资源和时间成本,构建的卷积神经网络模型在普通的个人笔记本上即可进行训练,此外还增加了MLP感知器作为对比,从结果中看出卷积神经网络效果更好。综合以上几点来看,本文的研究具有现实可应用性,具有可推广性,因而具有较高的实用价值!

Python MNIST手写体识别详解与试练

到此这篇关于Python MNIST手写体识别详解与试练的文章就介绍到这了,更多相关Python 手写体识别内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
理解Python中的With语句
Feb 02 Python
Python第三方库xlrd/xlwt的安装与读写Excel表格
Jan 21 Python
教你用 Python 实现微信跳一跳(Mac+iOS版)
Jan 04 Python
Django models.py应用实现过程详解
Jul 29 Python
Python在OpenCV里实现极坐标变换功能
Sep 02 Python
Python for循环搭配else常见问题解决
Feb 11 Python
python关于变量名的基础知识点
Mar 03 Python
python脚本定时发送邮件
Dec 22 Python
Numpy中的数组搜索中np.where方法详细介绍
Jan 08 Python
selenium如何定位span元素的实现
Jan 13 Python
python 算法题——快乐数的多种解法
May 27 Python
Python办公自动化解决world文件批量转换
Sep 15 Python
Python基础 括号()[]{}的详解
Nov 07 #Python
Python Flask搭建yolov3目标检测系统详解流程
关于 Python json中load和loads区别
Nov 07 #Python
Python卷积神经网络图片分类框架详解分析
Nov 07 #Python
Python人工智能之混合高斯模型运动目标检测详解分析
7个关于Python的经典基础案例
Nov 07 #Python
python机器学习创建基于规则聊天机器人过程示例详解
You might like
php设计模式 Decorator(装饰模式)
2011/06/26 PHP
php生成二维码的几种方式整理及使用实例
2013/06/03 PHP
7个鲜为人知却非常实用的PHP函数
2015/07/01 PHP
php实现的http请求封装示例
2016/11/08 PHP
OAuth认证协议中的HMACSHA1加密算法(实例)
2017/10/25 PHP
JS.GetAllChild(element,deep,condition)使用介绍
2013/09/21 Javascript
文本框只能选择数据到文本框禁止手动输入
2013/11/22 Javascript
js获取电脑分辨率的思路及操作
2013/11/22 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
JS实现随机乱撞彩色圆球特效的方法
2015/05/05 Javascript
解决Window10系统下Node安装报错的问题分析
2016/12/13 Javascript
JavaScript之Canvas_动力节点Java学院整理
2017/07/04 Javascript
js移动端事件基础及常用事件库详解
2017/08/15 Javascript
基于JavaScript实现五子棋游戏
2020/08/26 Javascript
nodeJS微信分享
2017/12/20 NodeJs
详解vuex中mapState,mapGetters,mapMutations,mapActions的作用
2018/04/13 Javascript
在vue中使用v-bind:class的选项卡方法
2018/09/27 Javascript
详解Vue组件插槽的使用以及调用组件内的方法
2018/11/13 Javascript
在微信小程序中使用mqtt服务的方法
2019/12/13 Javascript
RxJS在TypeScript中的简单使用详解
2020/04/13 Javascript
python以环状形式组合排列图片并输出的方法
2015/03/17 Python
Python登录并获取CSDN博客所有文章列表代码实例
2017/12/28 Python
python控制windows剪贴板,向剪贴板中写入图片的实例
2018/05/31 Python
numpy.ndarray 交换多维数组(矩阵)的行/列方法
2018/08/02 Python
值得收藏,Python 开发中的高级技巧
2018/11/23 Python
python面试题之列表声明实例分析
2019/07/08 Python
使用Python制作表情包实现换脸功能
2019/07/19 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
django 扩展user用户字段inlines方式
2020/03/30 Python
python中sort sorted reverse reversed函数的区别说明
2020/05/11 Python
python如何写个俄罗斯方块
2020/11/06 Python
10种CSS3实现的loading动画,挑一个走吧?
2020/11/16 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
总经理助理的职责
2014/03/14 职场文书
JS如何实现基于websocket的多端桥接平台
2021/05/14 Javascript