python MLP多层感知器
手写字识别
手写识别是常见的图像识别任务,计算机通过 手写体图片来识别出图片中的字,与印刷字体不同的是,不同人的手写体风格迥异
大小不一,造成了计算机对手写识别任务的一些困难
数字手写体识别由于其有限的类别(0-9共10个数字)
成为了相对简单的手写识别任务,DBRHD和MNIST是常用的两个数字手写识别数据集
MNIST数据集
MNIST的下载连接
MNIST是一个包含数字0-9的手写体图片数据集,图片已归一化为以手写数字为中心的2828规格的图片
MNIST由训练信与测试集两个部分组成,各部分规模如下:
训练集:60000个
测试集:10000个手写体图片及对应标签
图片大小:2828个像素点组成
像素值区间:0-255 ,0表示白色,255表示黑色
DBRHD数据集
DBRHD(PenBased Recognition of Handwritten Digits Data Set) 是UCI的机器学习中心提供的数字手写体数据库
DBRHD数据集包含大量的数字0-9的手写休图片,这些图片来源于44位不同的人的手写数字,图片已归一化为以手写数字为中心
的32*32的规格的图片,DBRHD的训练集与测试集组成如下:
训练集:7494个手写体图片及对应标签,来源于40位手写者
测试集:3498个手写体图片及对应标签,来源于14位手写者
常用于数字手写全的分类器:
线性分类器,K最近邻分类器
非线性分类器,SVM
MLP多层感知器,卷积神经网络
实例编写
介绍:手写数字识别是一个多分类问题,共有10个分类,每个手写数字图像的类别标签是0-9中的其中一个数,
任务:利用sklearn来训练一个简单的全连接神经网络,即多层感知机(Multilayer perceptron ,MLP)
用于识别数据集DBRHD的手写数字
MLP的输入
DBRHD数据集的每个图片是一个由0或1组成的3232的文本矩阵
多层感知机的软入为图片矩阵层开的11024个神经元
MLP输出:’one-hot vectors’
一个one-hot向量除了某一们的数字是1以外其余各维度数字都是0
图片标签将表示成一个只有在第n维度(从0开始)数字为1的10维向量,比如,标签0将表示成[1,0,0,0,0,0,1,1,0,0,0]
MLP输出层具有10个神经元。
MLP的输入与输出层,中间隐藏层的层数和神经元的个数设置都将影响该MLP模型的准确率
在本实例中,我们只设置一层隐藏层,在后结实验中比较该隐藏层神经元个数为50,100,200时的MLP效果
MLP手写识别实例构建
步骤1:建立工程并导入sklearn包
步骤2:加载训练数据
步骤3:训练神经网络
步骤4:测试集评价
‘’’
import numpy as np
from os import listdir #使用listdir模块,用于访问本地文件
from sklearn.neural_network import MLPClassifier
def img2vector(filename):
retmat=np.zeros([1024],int)
fr=open(filename)
lines=fr.readlines()
for i in range(32):
for j in range(32):
retmat[i*32+j]=lines[i][j]
return retmat
def readdataset(path): #文件中定义 加载训练数据的函数,将样本标签转化为one-hot向量
filelist=listdir(path)
numfiles=len(filelist)
dataset=np.zeros([numfiles,1024],int)
hulabels=np.zeros([numfiles,10])
for i in range(numfiles):
filepath=filelist[i]
digit=int(filepath.split('_')[0])
hulabels[i][digit]=1.0
dataset[i]=img2vector(path+'/'+filepath)
return dataset,hulabels
#将训练数据提从文件中提取并保存在变量中,供后续使用
train_dataset,train_hulabels=readdataset('trainingdigits')
#构建神经网络:设置网络的隐藏层数,各隐藏层神经元个数、激活函数、学习率、优化方法、最大迭代次数
#设置一个隐藏层,设置含 100个神经元的隐藏层
#hidden_layer_sizes存放的是一个元组,表示第i层隐藏层里神经元的个数。
#使用logistic激活函数和adam优化方法,并令初始学习率为0.0001,迭代2000次
clf=MLPClassifier(hidden_layer_sizes=(100,),
activation='logistic',
solver='adam',
learning_rate_init=0.0001,
max_iter=2000)
#fit函数能够根据训练集对应标签集自动设置多层感知机的输入与输出层的神经元个数
#如:train_dataset为n*1024的矩阵,train_hulabels为n*10的矩阵,则fit函数将MLP的输入层神经元个数设置为1024,输出层神经元个数为10
clf.fit(train_dataset,train_hulabels)
#加载测试集,并对训练好的MLP对测试集进行预测,并计算错误率
dataset,hulabels=readdataset('testdigits')
res=clf.predict(dataset) #对测试集进行预测
error_num=0
num=len(dataset) #测试集数目
for i in range(num): #遍历预测结果,比较长度为10的数组,返回包含01的数组,0为不同,1为相同,若预测结果与真实结果相同,则10个数字全为1,否则不全为1
if np.sum(res[i]==hulabels[i]) <10:
error_num+=1
print('total num :',num,'wrong num:',error_num,'wrongrate:',error_num /float(num))