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时区设置方法与pytz查询时区教程
Nov 27 Python
深入理解NumPy简明教程---数组2
Dec 17 Python
基于python list对象中嵌套元组使用sort时的排序方法
Apr 18 Python
python实现排序算法解析
Sep 08 Python
python的几种矩阵相乘的公式详解
Jul 10 Python
Python简易计算器制作方法代码详解
Oct 31 Python
详解python tkinter模块安装过程
Jan 06 Python
简单了解Django ORM常用字段类型及参数配置
Jan 07 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
详解Python中Pyyaml模块的使用
Oct 08 Python
python 实现图片批量压缩的示例
Dec 18 Python
Python中递归以及递归遍历目录详解
Oct 24 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
Apache2 httpd.conf 中文版
2006/12/06 PHP
php 常用字符串函数总结
2008/03/15 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
php实现模拟登陆方正教务系统抓取课表
2015/05/19 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
jquery1.4 教程二 ajax方法的改进
2010/02/25 Javascript
jquery tab标签页的制作
2010/05/10 Javascript
jquery缓动swing liner控制动画过程不同时刻的速度
2014/05/29 Javascript
JavaScript中的原型和继承详解(图文)
2014/07/18 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
分享JavaScript监听全部Ajax请求事件的方法
2016/08/28 Javascript
用jquery快速解决IE输入框不能输入的问题
2016/10/04 Javascript
模板视图和AngularJS之间冲突的解决方法
2016/11/22 Javascript
获取IE浏览器Cookie信息的方法
2017/01/23 Javascript
canvas实现简易的圆环进度条效果
2017/02/28 Javascript
Angular2里获取(input file)上传文件的内容的方法
2017/09/05 Javascript
vue+vuecli+webpack中使用mockjs模拟后端数据的示例
2017/10/24 Javascript
如何使用less实现随机下雪动画详解
2019/01/02 Javascript
vue 基于abstract 路由模式 实现页面内嵌的示例代码
2020/12/14 Vue.js
Python使用matplotlib绘制余弦的散点图示例
2018/03/14 Python
Python多进程与服务器并发原理及用法实例分析
2018/08/21 Python
python如何实现代码检查
2019/06/28 Python
python3中利用filter函数输出小于某个数的所有回文数实例
2019/11/24 Python
python对数组进行排序,并输出排序后对应的索引值方式
2020/02/28 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
HTML4和HTML5之间除了相似以外的10个主要不同
2012/12/13 HTML / CSS
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
全球速卖通:AliExpress(国际版淘宝)
2017/09/20 全球购物
面试求职的个人自我评价
2013/11/16 职场文书
求职自荐信的格式
2014/04/07 职场文书
经理任命书模板
2014/06/06 职场文书
小学感恩教育活动总结
2014/07/07 职场文书
办公室务虚会发言材料
2014/10/20 职场文书
Django程序的优化技巧
2021/04/29 Python
解决mysql模糊查询索引失效问题的几种方法
2021/06/18 MySQL