首页 > 编程知识 正文

基于cnn的手写数字识别,手写数字

时间:2023-05-04 09:54:39 阅读:25602 作者:1908

1.概念介绍:

图像识别(Image Recognition )是指利用计算机处理、分析、理解图像,识别各种模式的目标和对象的技术。

图像识别的发展经历了文字识别、数字图像处理与识别、物体识别三个阶段。 在机器学习领域,这种识别问题一般转化为分类问题。

手写识别是一项常见的图像识别任务。 计算机从手写的照片中识别出了照片中的字。 与打印字体不同,不同的人手写风格大不相同,大小不同,计算机很难给对方写识别任务。

数字手写识别由于其有限的类别(0~9的合计10个数字),所以成为了比较简单的手写识别任务。 DBRHD和MNIST是两个常用的数字手写识别数据集

2.数据介绍:

MNIST下载链接: http://yann.le Cun.com/exdb/Mn ist /

MNIST是包含数字0~9的手写图像数据集,图像标准化为以手写数字为中心的28*28大小的图像。

MNIST由训练集和测试集两部分组成,每个部分的规模如下:

培训集: 60,000张手绘照片和对应标签

测试集: 10,000张手绘照片及其相应标签

基于pen-basedrecognitionofhandwrittendigitsdataset (DBR高清)是由UCI的机器学习中心提供的数字手写数据库。 https://archive.ics.UCI.edu/ml/datasets/peets

DBRHD数据集包含大量来自44个不同人的手写数字的数字0到9的手写图像,并标准化为以手写数字为中心的32*32大小的图像。

DBRHD的培训集和测试集配置如下:

训练集:来自7,494张手写照片和对应标签,40个手写者

测试集: 3,498张手写照片和对应的标签来自14个手写者

3.任务过程:

输入

输出

MPL的结构

步骤

import numpy as np#使用listdir模块访问本地文件fromosimportlistdirfromsklearn.neural _ networkimportmlpclassifier #

def img 2矢量(文件名) :

retmat=NP.Zeros([1024],int ) )。

打开包含fr=open (文件名) 3232大小的数字文件

lines=fr.readlines(# (读取#文件中的所有行

forIinrange(32 ) :

forjinrange(32 ) : #将0.1的数字存储在retMat中

retMat[i*32 j]=lines[i][j];

return retMat

#将示例标签转换为one-hot向量

差速数据集(路径) :

获取文件列表=列表dir (路径) #文件夹下的所有文件

num files=len (文件列表) )计数要读取的文件数

dataset=NP.zeros([numfiles,1024],int ) #用于存储所有数字文件

HWlabels=NP.Zeros([numfiles,10] ) #用于存储对应的one-hot标签

forIinrange(numfiles ) :

获取文件路径=文件列表[ I ] #文件名/路径

digit=int(filepath.split ) _’) [0]

硬件标签[ I ] [ digit ]=1.0

dataSet[i]=img

2vector(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))

实验结果(同上)




版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。