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中使用mysql数据库详细介绍
Mar 27 Python
python使用PyGame模块播放声音的方法
May 20 Python
python操作MySQL 模拟简单银行转账操作
Sep 27 Python
《与孩子一起学编程》python自测题
May 27 Python
python3 批量获取对应端口服务的实例
Jul 25 Python
Python高级编程之消息队列(Queue)与进程池(Pool)实例详解
Nov 01 Python
实现Python与STM32通信方式
Dec 18 Python
python3 字符串知识点学习笔记
Feb 08 Python
python实现飞船大战
Apr 24 Python
python获取命令行参数实例方法讲解
Nov 02 Python
Django项目在pycharm新建的步骤方法
Mar 02 Python
Python Django项目和应用的创建详解
Nov 27 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
SONY ICF-SW55的电路分析
2021/03/02 无线电
php中数据的批量导入(csv文件)
2006/10/09 PHP
php魔术变量用法实例详解
2014/11/13 PHP
Laravel 5框架学习之向视图传送数据
2015/04/08 PHP
PHP导出Excel实例讲解
2016/01/24 PHP
php中static和const关键字用法分析
2016/12/07 PHP
cookie 最近浏览记录(中文escape转码)具体实现
2013/06/08 Javascript
jQuery 文本框得失焦点的简单实例
2014/02/19 Javascript
浅析基于WEB前端页面的页面内容搜索的实现思路
2014/06/10 Javascript
javascript设置连续两次点击按钮时间间隔的方法
2014/10/28 Javascript
JavaScript调试工具汇总
2014/12/23 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
Node.js利用js-xlsx处理Excel文件的方法详解
2017/07/05 Javascript
vue实现登陆登出的实现示例
2017/09/15 Javascript
对vue.js中this.$emit的深入理解
2018/02/23 Javascript
AngularJS与BootStrap模仿百度分页的示例代码
2018/05/23 Javascript
Ant Design Vue table中列超长显示...并加提示语的实例
2020/10/31 Javascript
vue print.js打印支持Echarts图表操作
2020/11/13 Javascript
[02:39]我与DAC之Newbee.Moogy:从论坛到TI
2018/03/26 DOTA
python django集成cas验证系统
2014/07/14 Python
Pandas 数据处理,数据清洗详解
2018/07/10 Python
详解flask入门模板引擎
2018/07/18 Python
Python3爬虫学习之爬虫利器Beautiful Soup用法分析
2018/12/12 Python
Python3简单实现串口通信的方法
2019/06/12 Python
在tensorflow实现直接读取网络的参数(weight and bias)的值
2020/06/24 Python
pycharm中使用request和Pytest进行接口测试的方法
2020/07/31 Python
windows系统Tensorflow2.x简单安装记录(图文)
2021/01/18 Python
Ray-Ban雷朋西班牙官网:全球领先的太阳眼镜品牌
2018/11/28 全球购物
COSETTE官网:奢华,每天
2020/03/22 全球购物
中医药大学市场营销专业自荐信
2013/09/29 职场文书
预备党员转正考核材料
2014/06/03 职场文书
青春飞扬演讲稿
2014/09/11 职场文书
2014年预备党员端正入党动机思想汇报
2014/09/13 职场文书
工作岗位职责范本
2015/02/15 职场文书
Java如何实现树的同构?
2021/06/22 Java/Android