机器学习应用——监督学习(下)“手写数字识别”(神经网络实现&KNN实现)

前言

机器学习应用博客中,将核心介绍三大类学习,即:无监督学习、监督学习、强化学习。

本篇将简要介绍监督学习的“手写数字识别”实例

运用MNIST数据集和DBRHD数据集,使用神经网络实现和KNN实现识别功能

一、实例介绍

1.图像识别(lmage Recognition)

(1)定义是指利用计算机对图像进行处理、分析和理解,以识别各种不同模式的目标和对像的技术。
(2)图像识别的发展经历了三个阶段:文字识别、数字图像处理与识别、物体识别。(机器学习领域一般将此类识别问题转化为分类问题。)

2.手写识别

(1)手写识别是常见的图像识别任务。
(2)计算机通过手写体图片来识别出图片中的字,与印刷字体不同的是,不同人的手写体风格迥异,大小不一,造成了计算机对手写识别任务的一些困难。
(3)数字手写体识别由于其有限的类别(0~9共10个数字)成为了相对简单的手写识别任务。DBRHD和MNIST是常用的两个数字手写识别数据集。

3.MNIST数据集

(1)下载链接:http://yann.lecun.com/exdb/mnist/
(2)MNIST是一个包含数字0~9的手写体图片数据集,图片已归一化为以手写数字为中心的28*28规格的图片。
(3)MNIST由训练集与测试集两个部分组成,各部分规模如下:
1)训练集:60,000个手写体图片及对应标签
2)测试集:10,000个手写体图片及对应标签
(4)手写数字样例
在这里插入图片描述

1)MNIST数据集中的每一个图片由28*28个像素点组成。
2)每个像素点的值区间为0~255,0表示白色,255表示黑色。

4.DBRHD数据集

(1)下载链接:https://archive.ics.uci.edu/ml/datasets/Pen-Based+Recognition+of+Handwritten+Digits
(2)DBRHD (Pen-Based Recognition of HandwrittenDigits Data Set)是UCI的机器学习中心提供的数字手写体数据库

(3)DBRHD数据集包含大量的数字0~9的手写体图片,这些图片来源于44位不同的人的手写数字,图片已归一化为以手写数字为中心的32*32规格的图片。

(4)DBRHD的训练集与测试集组成如下:
1)训练集:7,494个手写体图片及对应标签,来源于40位手写者。
2)测试集:3,498个手写体图片及对应标签,来源于14位手写者。

(5)数据集特点
1)去掉了图片颜色等复杂因素,将手写体数字图片转化为训练数据为大小32*32的文本矩阵。
2)空白区域使用0代表,字迹区域使用1表示。
在这里插入图片描述

5.手写识别实例

(1)已有许多模型在MNIST或DBRHD数据集上进行了实验,有些模型对数据集进行了偏斜矫正,甚至在数据集上进行了人为的扭曲、偏移、缩放及失真等操作以获取更加多样性的样本,使得模型更具有泛化性。

(2)常用于数字手写体的分类器:
1)线性分类器
2)K最近邻分类器
3)非线性分类器
4)SVM
5)MLP多层感知器
6)卷积神经网络
(3)后续任务:利用全连接的神经网络实现手写识别的任务

二、神经网络实现手写识别

1.任务介绍

(1)手写数字识别是一个多分类问题,共有10个分类,每个手写数字图像的类别标签是0~9中的其中一个数。例如下片的标签分别是0,1,2。
在这里插入图片描述

(2)任务:利用sklearn来训练一个简单的全连接神经网络,即多层感知机(Multilayer perceptron,MLP)用于识别数据集DBRHD的手写数字。

2.MLP的输入

(1)DBRHD数据集的每个图片是一个由0或1组成的3232的文本矩阵;
(2)多层感知机的输入为图片矩阵展开的1
1024个神经元。

3.MLP的输出(one-hot vectors)

(1)一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。
(2)图片标签将表示成一个只有在第n维度(从0开始)数字为1的10维向量。
(3)比如,标签0将表示成[1,0,0,0,0,0,0,0,0,0]o即,MLP输出层具有10个神经元。

4.MLP结构

(1)MLP的输入与输出层,中间隐藏层的层数和神经元的个数设置都将影响该MLP模型的准确率。
(2)然而目前的隐藏层只能通过经验性的手动设置
(3)在本实例中,我们只设置一层隐藏层,在后续实验中比较该隐藏层神经元个数为50、100、200时的MLP效果。
在这里插入图片描述

5.MLP手写识别实例构建

(1)建立工程并导人sklearn包
(2)加载训练数据
1)定义img2vector函数,将加载的32*32的图片矩阵展开成—列向量
2)定义加载训练数据的函数readDataSet ,并将样本标签转化为one-hot向量
3)调用readDataSet和img2vector函数加载数据,将训练的图片存放在train_dataSet中,对应的标签则存在train_hwLabels中

(3)训练神经网络
1)在sklearnBP .py文件中,构建神经网络∶设置网络的隐藏层数、各隐藏层神经元个数、激活函数、学习率、优化方法、最大迭代次数。
2)使用训练数据训练构建好的神经网络

(4)测试集评价
1)加载测试集
2)使用训练好的MLP对测试集进行测试,并计算错误率

#建立工程并导人sklearn包
import numpy as np
from os import listdir # 使用listdir模块,用于访问本地文件
from sklearn.neural_network import MLPClassifier

# 加载训练数据
#定义img2vector函数,将加载的32*32的图片矩阵展开成—列向量
def img2vector(fileName):
    retMat = np.zeros([1024],int) #定义返回的矩阵,大小为1*1024
    fr = 
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬茶@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值