神经网络应用于手写数字识别-matlab

运用matlab编程进行神经网络进行手写数字识别。

实验过程:
一、BP神经网络
神经网络是由很多神经元组成,可以分为输入,输出,隐含层。
BP神经网络的特点:信号前向传递,信号反向传播。若输出存在误差,根据误差调整权值和阈值,使网络的输出接近预期。
在用BP神经网络进行预测之前要训练网络训练过程如下:
1.网络初始化:各个参数的确定包括输入,输出,隐含层的节点数,输入和隐含,隐含和输出层之间的权值,隐含,输出层的阈值,学习速度和激励函数。
2.计算隐含层输出
3.计算输出层输出
4.误差计算
5.权值更新
6.阈值更新
7.判断迭代是否结束

二、模型建立
数据集介绍:
数据集包含0-9这10个数字的手写体。是放在10个文件夹里,文件夹的名称对应存放的手写数字图片的数字,每个数字500张,每张图片的像素统一为28*28。

识别流程:
首先要对数据进行处理,这个主要是批量读取图片和特征提取的过程,特征提取的方法很多,这里只挑选最简单的来实现,然后是训练出一个神经网络的模型,最后用测试数据进行测试。为了方面,这里的神经网络的创建,训练和测试采用matlab函数来实现。

运行流程:
1.确定神经网络的输入,输出。
输入是BP神经网络很重要的方面,输入的数据是手写字符经过预处理和特征提取后的数据。预处理有二值化,裁剪掉空白的区域,然后再统一大小为7050为特征提取做准备。特征提取采用的是粗网格特征提取,把图像分成35个区域,每个区域100像素,统计区域中1像素所占的比例。经过预处理特征提取后,2828图像转成135的特征矢量。提取完5000张图片后,依次把所有的特征存于一个矩阵(355000)中。
2.神经的网络的训练
用matlab的rands函数来实现网络权值的初始化,网络结构为输入层35,隐藏层34,输出层10,学习速率为,隐藏层激励函数为sigmoid函数。随机抽取4500张图片提取特征后输入,按照公式计算隐含层和输出层输出,误差,更新网络权值。
3.神经网络的预测
训练好神经网络之后,用随机抽取的500个数字字符对网络进行预测,输入特征向量,计算隐含层和输出层输出,得到最后预测的数据。同时计算每个数字的正确率和全体的正确率。最后得到的总体正确率为。

主函数:
clc;
clear all;
close all;
%% 读取图像
root=‘./data’;
img=read_train(root);
%% 提取特征
img_feature=feature_lattice(img);
%% 构造标签
class=10;
numberpclass=500;
ann_label=zeros(class,numberpclassclass);
ann_data=img_feature;
for i=1:class
for j=numberpclass
(i-1)+1:numberpclass*i
ann_label(i,j)=1;
end
end

%% 选定训练集和测试集
k=rand(1,numberpclassclass);
[m,n]=sort(k);
ntraindata=4500;
ntestdata=500;
train_data=ann_data(:,n(1:ntraindata));
test_data=ann_data(:,n(ntraindata+1:numberpclass
class));
train_label=ann_label(:,n(1:ntraindata));
test_label=ann_label(:,n(ntraindata+1:numberpclass*class));
%% BP神经网络创建,训练和测试
net=network_train(train_data,train_label);
predict_label=network_test(test_data,net);
%% 正确率计算
[u,v]=find(test_label1);
label=u’;
error=label-predict_label;
accuracy=size(find(error
0),2)/size(label,2)

批量读取图片函数:
文件存放特点:在data下有10个子文件夹,每个子文件夹下有500张图片。函数可以利用于任何批量图片的读取,传入的是文件夹路径,输出的是一个n(对应图片数目)维cell,每个cell存放的是图片的数据。
function [imglist] = read_train(root)
%读取文件夹%
out_Files = dir(root);%展开
tempind=0;
imglist=cell(0);
n=length(out_Files);
%读取文件%
for i = 1:n;
if strcmp(out_Files(i).name,‘.’)|| strcmp(out_Files(i).name,‘…’)
else
rootpath=strcat(root,‘/’,out_Files(i).name);
in_filelist=dir(rootpath);
ni=length(in_filelist);
for j=1:ni
if strcmp(in_filelist(j).name,‘.’)|| strcmp(in_filelist(j).name,‘…’)|| strcmp(in_filelist(j).name,‘’)|| strcmp(in_filelist(j).name,‘’)
else
tempind=tempind+1;
imglist{tempind}=imread(strcat(rootpath,‘/’,in_filelist(j).name));
end
end
end
end
end

特征提取函数:
提取所有图像的特征,二值化—resize-提取特征
function feature = feature_lattice(img)
% 输入:黑底白字的二值图像。输出:35维的网格特征
% ==提取特征,转成57的特征矢量,把图像中每1010的点进行划分相加,进行相加成一个点=%
%==即统计每个小区域中图像象素所占百分比作为特征数据%
for i=1:length(img);
bw2=im2bw(img{i},graythresh(img{i}));
bw_7050=imresize(bw2,[70,50]);
for cnt=1:7
for cnt2=1:5
Atemp=sum(bw_7050(((cnt10-9):(cnt10)),((cnt210-9):(cnt210))));%10*10box
lett((cnt-1)*5+cnt2)=sum(Atemp);
end
end
lett=((100-lett)/100);
lett=lett’;
feature(:,i)=lett;
end

构造标签:
要构造出适合神经网络的标签,在这个例子中有10个类,若为某个标签,那么这个位置的值为1,其余为0。

BP神经网络创建,训练和测试:
主要是几个参数的设置,layer隐含层的神经元个数。trainFcn:训练算法
function net = network_train(train_data,train_label )
% 输入:训练图像特征和label。输出:训练好的神经网络

% BP网络训练
% 初始化网络结构
layer=25;
net=newff(train_data,train_label,layer);
‘trainrp’;
% 网络训练
net=train(net,train_data,train_label);
end

function out = network_test(test_data,net)
%% BP网络预测

an=sim(net,test_data);
for i=1:length(test_data)
out(i)=find(an(:,i)==max(an(:,i)));
end

end

实验结果:

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值