一、实验目的
• 1、理解图像识别、手写识别的原理;
• 2、掌握Sklearn实现基于MLP的手写识别;
• 3、掌握Sklearn实现基于KNN的手写识别。
二、实验内容与要求
【实验内容】基于MLP的手写识别
手写数字识别是一个多分类问题,共有10个分类,每个手写数字图像的类别标签是0~9中的其中一个数。例如下面这三张图片的标签分别是0,1,2。
利用sklearn来训练一个简单的全连接神经网络,即多层感知机 (Multilayer perceptron,MLP)用于识别数据集DBRHD的手写数字。
MLP的输入:
DBRHD数据集的每个图片是一个由0或1组成的32*32的文本矩阵; 多层感知机的输入为图片矩阵展开的1*1024个神经元。
MLP输出:“one-hot vectors”
一个one-hot向量除了某一位的数字是1以外其余各维度数字都是0。图片标签将表示成一个只有在第n维度(从0开始)数字为1的10维向量。比如,标签0将表示成[1,0,0,0,0,0,0,0,0,0,0]。即,MLP输出层具有10个神经元。
MLP结构:
MLP的输入与输出层,中间隐藏层的层数和神经元的个数设置都将影响该MLP模型的准确率。在本实验中,只设置一层隐藏层,将在后续实验中比较该隐藏层神经元个数为50、100、200时的MLP效果。
【任务介绍】
本实验利用sklearn来训练一个K最近邻(k-Nearest NeighborKNN)
分类器,用于识别数据集DBRHD的手写数字。比较KNN的识别效果与多层感知机的识别效果。
【KNN手写识别实体构建】
• 步骤1:建立工程并导入sklearn包
• 步骤2:加载训练数据
• 步骤3:构建KNN分类器
• 步骤4:测试集评价
三、实验程序与结果
import numpy as np
from os import listdir
from sklearn.neural_network import MLPClassifier
from sklearn.neighbors import KNeighborsClassifier
def img2vector(fileName):
retMat = np.zeros([1024],int)
fr = open(fileName)
lines = fr.readlines()
for i in range(32):
for j in range(32):