前言
机器学习应用博客中,将核心介绍三大类学习,即:无监督学习、监督学习、强化学习。
本篇将简要介绍监督学习的“手写数字识别”实例
运用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)多层感知机的输入为图片矩阵展开的11024个神经元。
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 =