手写数字识别的实现(案例)
1.概念介绍:
图像识别(Image Recognition)是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。
图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。机器学习领域一般将此类识别问题转化为分类问题。
手写识别是常见的图像识别任务。计算机通过手写体图片来识别出图片中的字,与印刷字体不同的是,不同人的手写体风格迥异,大小不一, 造成了计算机对手写识别任务的一些困难。
数字手写体识别由于其有限的类别(0~9共10个数字)成为了相对简单 的手写识别任务。DBRHD和MNIST是常用的两个数字手写识别数据集
2.数据介绍:
MNIST的下载链接:http://yann.lecun.com/exdb/mnist/。
MNIST是一个包含数字0~9的手写体图片数据集,图片已归一化为以手写数 字为中心的28*28规格的图片。
MNIST由训练集与测试集两个部分组成,各部分 规模如下:
训练集:60,000个手写体图片及对应标签
测试集:10,000个手写体图片及对应标签
DBRHD(Pen-Based Recognition of Handwritten Digits Data Set)是UCI的机器学习中心提供的数字手写体数据库: https://archive.ics.uci.edu/ml/datasets/PenBased+Recognition+of+Handwritten+Digits。
DBRHD数据集包含大量的数字0~9的手写体图片,这些图片来源于44位不同的人的手写数字,图片已归一化为以手写数字为中心的32*32规格的图片。
DBRHD的训练集与测试 集组成如下:
训练集:7,494个手写体图片及对应标签,来源于40位手写者
测试集:3,498个手写体图片及对应标签,来源于14位手写者
3.任务过程:
①输入
②输出
③MPL的结构
④步骤
import numpy as np #使用listdir模块,用于访问本地文件 from os import listdir from sklearn.neural_network import MLPClassifier
#定义img2vector函数,将加载的3232 的图片矩阵展开成一列向量
def img2vector(fileName):
retMat =np.zeros([1024],int)
fr = open(fileName) #打开包含3232大小的数字文件
lines =fr.readlines() #读取文件的所有行
for i in range(32):
for j in range(32): #将01数字存放在retMat
retMat[i*32+j]=lines[i][j];
return retMat
#并将样本标签转化为one-hot向量
def readDataSet(path):
fileList =listdir(path) #获取文件夹下所有文件
numFiles =len(fileList) #统计需要读取的文件的数目
dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件
hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot
for i in range(numFiles):
filePath =fileList[i] #获取文件名称/路径
digit =int(filePath.split(’_’)[0])
hwLabels[i][digit]=1.0
dataSet[i]=img2vector(path+’/’+filePath)#读取文件内容
return dataSet,hwLabels
train_dataSet,train_hwLabels =readDataSet(‘trainingDigits’)
#构建神经网络:设置网络的隐藏层数、各隐藏层神经元个数、
# 激活函数、学习率、优化方法、最大迭代次数。
#hidden_layer_sizes 存放的是一个元组,表示第i层隐藏层里神经元的个数
# 使用logistic激活函数和adam优化方法,并令初始学习率为0.0001
clf =MLPClassifier(hidden_layer_sizes=(50,),activation=‘logistic’,
solver=‘adam’,learning_rate_init=0.0001,max_iter=2000)
#fit函数能够根据训练集及对应标签集自动设置多层感知机的输入与输出层的神经元个数。
#例如train_dataSet为n1024的矩阵,train_hwLabels为n10的矩阵,
# 则fit函数将MLP的输入层神经元个数设为1024,输出层神经元个数为 10.
clf.fit(train_dataSet,train_hwLabels)
#测试集评价
dataSet,hwlLabels =readDataSet(‘testDigits’)
res=clf.predict(dataSet) #对测试集进行预测
error_num =0 #统计预测错误的数目
num =len(dataSet) #测试集的数目
for i in range(num):
#比较长度为10的数组,返回包含01的数组,0为不同,1为相同
if np.sum(res[i]==hwlLabels[i])<10:
error_num+=1
print(“Total num:”,num,“Wrong num:”,error_num," WrongRate:",error_num/float(num))
实验效果:
以下结果为课程结果,我自己实验的结果与这个结果相差不大。
2.使用KNN分类器识别数据集DBRHD的手写数字(内容与上面差不多,只是使用算法有些差别)
import numpy as np #使用listdir模块,用于访问本地文件 from os import listdir from sklearn import neighbors
#定义img2vector函数,将加载的3232 的图片矩阵展开成一列向量
def img2vector(fileName):
retMat =np.zeros([1024],int)
fr = open(fileName) #打开包含3232大小的数字文件
lines =fr.readlines() #读取文件的所有行
for i in range(32):
for j in range(32): #将01数字存放在retMat
retMat[i*32+j]=lines[i][j];
return retMat
#并将样本标签转化为one-hot向量
def readDataSet(path):
fileList =listdir(path) #获取文件夹下所有文件
numFiles =len(fileList) #统计需要读取的文件的数目
dataSet =np.zeros([numFiles,1024],int) #用于存放所有的数字文件
hwLabels =np.zeros([numFiles,10]) #用于存放对应的标签one-hot
for i in range(numFiles):
filePath =fileList[i] #获取文件名称/路径
digit =int(filePath.split(’_’)[0])
hwLabels[i][digit]=1.0
dataSet[i]=img2vector(path+’/’+filePath)#读取文件内容
return dataSet,hwLabels
train_dataSet,train_hwLabels =readDataSet(‘trainingDigits’)
#构建KNN分类器:设置查找算法以及邻居点 数量(k)值。
#KNN是一种懒惰学习法,没有学习过程,只在预测时去查找最近邻的点,
#数据集的输入就是构建KNN分类器的过程
knn =neighbors.KNeighborsClassifier(algorithm=‘kd_tree’,n_neighbors=3)
knn.fit(train_dataSet,train_hwLabels)
#测试集评价
dataSet,hwlLabels =readDataSet(‘testDigits’)
res=knn.predict(dataSet) #对测试集进行预测
error_num =np.sum(res!=hwlLabels) #统计预测错误的数目
num =len(dataSet) #测试集的数目
print(“Total num:”,num,“Wrong num:”,error_num," WrongRate:",error_num/float(num))
实验结果(同上)
手写数字识别的实现(案例)相关推荐
- 深度学习-Pytorch:项目标准流程【构建、保存、加载神经网络模型;数据集构建器Dataset、数据加载器DataLoader(线性回归案例、手写数字识别案例)】
1.拿到文本,分词,清晰数据(去掉停用词语): 2.建立word2index.index2word表 3.准备好预训练好的word embedding 4.做好DataSet / Dataloader ...
- 手写数字识别案例、手写数字图片处理
python_手写数字识别案例.手写数字图片处理 1.手写数字识别案例 步骤: 收集数据 带有标签的训练数据集来源于trainingDigits文件夹里面所有的文件,接近2000个文件,每个文件中有3 ...
- 【卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10)】
卷积神经网络CNN 实战案例 GoogleNet 实现手写数字识别 源码详解 深度学习 Pytorch笔记 B站刘二大人 (9.5/10) 在上一章已经完成了卷积神经网络的结构分析,并通过各个模块理解 ...
- 机器学习算法 08 —— 支持向量机SVM算法(核函数、手写数字识别案例)
文章目录 系列文章 支持向量机SVM算法 1 SVM算法简介 1.1 引入 1.2 算法定义 2 SVM算法原理 2.1 线性可分支持向量机 2.2 SVM计算过程与算法步骤(有点难,我也没理解透,建 ...
- 【ML-SVM案例学习】svm实现手写数字识别
文章目录 前言 一.源码分步解析 1.引入库 2. 设置属性防止中文乱码 3.加载数字图片数据 4.获取样本数量,并将图片数据格式化 5.模型构建 6.测试数据部分实际值和预测值获取 7.进行图片展示 ...
- 机器学习之算法案例手写数字识别
算法案例手写数字识别 MNIST数据集是机器学习领域中非常经典的一个数据集,由60000个 训练样本和10000个测试样本组成,每个样本都是一张28 * 28像素的灰度 手写数字图片. 选择算法,并保 ...
- 深度学习案例之基于 CNN 的 MNIST 手写数字识别
一.模型结构 本文只涉及利用Tensorflow实现CNN的手写数字识别,CNN的内容请参考:卷积神经网络(CNN) MNIST数据集的格式与数据预处理代码input_data.py的讲解请参考 :T ...
- 卷积神经网络案例:LeNet-5手写数字识别
一.LeNet-5网络结构 1.1 LeNet-5介绍: 由Yann LeCun(杨立昆)于1998年提出的一种经典的卷积网络结构. 第一个成功应用于数字识别问题的卷积神经网络. 1.2 LeNet- ...
- 【深度学习】学习案例:Keras 多层感知器手写数字识别
实验:Keras 多层感知器 手写数字识别 1. 下载 MNIST数据集(前提) 2. 进行数据预处理 3. 建立模型 4. 进行训练 5. 以测试数据评估模型 6. 进行预测 拓展: 1. 显示混淆 ...
- 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec...
人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...
最新文章
- python好学嘛-Python对于没有计算机基础知识的人来说,好学吗?
- 股市投资大师的股市投资名言
- C语言序列是否有序、序列中删除指定数字、序列中整数去重、有序序列合并问题
- 计算机网络网络层之链路状态路由算法
- 高斯克吕格投影分带计算
- 【小象学院】案例4——52周存钱挑战v4.0
- 求最大公约数和最小公倍数的做法(Java实现)
- 电感的工作原理与作用
- java脚手架_Java代码重构
- 司凤为璇玑抗鸿蒙熔炉,琉璃:结局最惨的是司凤和若玉?而是让人心疼的他,他死的太可惜...
- 数值分析基础工具使用Matlab绘制双曲线
- 计算机和人脑在线阅读,人脑与电脑
- PDF转换器用什么好?这款一定能够帮到你
- 贝多芬第九交响第五乐章合唱歌词
- 【数据库】数据分析专项练习题库-SQL试卷一
- DS实验4--求单链表交集与差集(含测试效果及实现)
- 通过python发送邮件
- PMP报考需要准备哪些?
- 倒排索引的理论和代码实现
- 一文讲清楚MySQL事务隔离级别和实现原理,后台开发人员必备知识
热门文章
- 借助Docker hub自己手动制作镜像(以Nginx镜像为例)
- Ecshop 2.7.1 B2B2C 小京东 商城网站 商品详情页二维码显示出错
- 【算法详解-数学】(1)φ的基本知识
- android和苹果位置共享,苹果和安卓手机修改微信共享位置方法。
- 小程序为什么要办理ICP增值电信业务经营许可证
- 虚拟机非正常关闭,里面的服务器重启报错:Error, some other host already uses address...
- npm配置镜像、设置代理cnpm和取消代理的方法
- Electron-vue开发实战7——命令行调用与系统级别右键菜单项的实现
- java 线程执行结束_java中怎么判断线程执行完毕
- 一文读懂十大数据存储加密技术