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命令行参数sys.argv使用示例
Jan 28 Python
理解Python中的With语句
Feb 02 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
利用python库在局域网内传输文件的方法
Jun 04 Python
Python 生成 -1~1 之间的随机数矩阵方法
Aug 04 Python
详解Python 正则表达式模块
Nov 05 Python
Opencv-Python图像透视变换cv2.warpPerspective的示例
Apr 11 Python
Python中remove漏删和索引越界问题的解决
Mar 18 Python
python如何写出表白程序
Jun 01 Python
利用Python将图片中扭曲矩形的复原
Sep 07 Python
python sleep和wait对比总结
Feb 03 Python
Python中tkinter的用户登录管理的实现
Apr 22 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制作静态网站的模板框架(四)
2006/10/09 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
JavaScript入门教程(1) 什么是JS
2009/01/31 Javascript
javascript打印html内容功能的方法示例
2013/11/28 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
jquery中获取元素里某一特定子元素的代码
2014/12/02 Javascript
javascript合并表格单元格实例代码
2016/01/03 Javascript
jQuery 生成svg矢量二维码
2016/08/09 Javascript
ES6实现的遍历目录函数示例
2017/04/07 Javascript
require.js中的define函数详解
2017/07/10 Javascript
详细AngularJs4的图片剪裁组件的实例
2017/07/12 Javascript
js 发布订阅模式的实例讲解
2017/09/10 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
解决Vue打包之后文件路径出错的问题
2018/03/06 Javascript
JS实现访问DOM对象指定节点的方法示例
2018/04/04 Javascript
vue 强制组件重新渲染(重置)的两种方案
2019/10/29 Javascript
在Python的web框架中配置app的教程
2015/04/30 Python
Python爬取个人微信朋友信息操作示例
2018/08/03 Python
python创建文件备份的脚本
2018/09/11 Python
对Python 语音识别框架详解
2018/12/24 Python
PyTorch实现AlexNet示例
2020/01/14 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
2020/02/03 Python
python装饰器实现对异常代码出现进行自动监控的实现方法
2020/09/15 Python
HTML5的语法变化介绍
2013/08/13 HTML / CSS
关于html字符串正则判断和匹配的具体使用
2019/12/12 HTML / CSS
医学专业大学生求职的自我评价
2013/11/27 职场文书
中专生自我鉴定书范文
2013/12/28 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
公司前台辞职报告
2014/01/19 职场文书
目标责任书格式
2014/07/28 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
2015年大学迎新工作总结
2015/07/16 职场文书
领导离职感言
2015/08/03 职场文书
pytorch显存一直变大的解决方案
2021/04/08 Python
python随机打印成绩排名表
2021/06/23 Python
Python中如何处理常见报错
2022/01/18 Python