【无标题】

一、实验目的

        通过学习BP神经网络技术,对手写数字进行识别,基于结构的识别法及模板匹配法来提高识别率。

二、实验器材

        PC机     matlab软件

三、实验内容

       按照BP神经网络设计方法选用两层BP网络,构造训练样本集,并构成训练所需的输入矢量和目标向量,通过画图工具,获得数字原始图像,截取图像像素为0的最大矩形区域,经过集合变换,变成16*16的二值图像,再进行反色处理,其图像数据特征提取为神经网络的输入向量。通过实验证实,BP神经网络应用于手写数字识别具有较高的识别率和可靠性。

四、实验原理 

1.神经元

  神经元作为神经网络的基本单元,对于外界输入具有简单的反应能力,在数学上表征为简单的函数映射。如下图是一个神经元的基本结构,

图中

是神经元的输入,

是神经元输入的权重,

激活函数来描述层与层输出之间的关系,从而模拟各层神经元之间的交互反应。激活函数必须满足处处可导的条件。常用的神经元函数有四种,分别是线性函数、指示函数、Sigmoid函数(S型函数)、径向基函数RBF(Radial Basis Function)。

        BP算法是由学习过程由信号的正向传播与误差的反向传播两个过程组成。由于多层前馈网络的训练经常采用误差反向传播算法,人们也常把将多层前馈网络直接称为BP网络。

2.BP神经网络

BP神经网络是前向多层神经网络(Multilayer Feedforward Neural Network, MLFN),其每一层包含若干个神经元,同一层的神经元之间没有互相联系,层间信息的传送只沿一个方向进行。主要包括输入层、隐含层和输出层,其中隐含层的数目随精确度的要求而有所变化。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。建立模型之后,就可以通过减少输出误差来训练网络中的参数,从而逼近正确的函数模型。

  BP神经网络主要分为信号的正向传播和误差反向传播两个过程,正向传播是指在样本数据输入后,计算输入层到隐含层,再到输出层的数据;误差反向传播就是将输出误差以某种形式通过隐含层向输入层逐层反传,将误差分摊给各层的单元,再使用梯度下降法修正各单元的权值。一般当网络输出的误差减少到可接受的程度或者进行到预先设定的学习次数时,训练结束。

如下图

 

       BP算法的基本思想是,学习过程由信号的正向传播与误差的反向传播两个过程组成。正向传播时,输入样本从输入层传入,经各隐层逐层处理后,传向输出层。若输出层的实际输出与期望的输出(教师信号)不符,则转入误差的反向传播阶段。误差反传是将输出误差以某种形式通过隐层向输入层逐层反传,并将误差分摊给各层的所有单元,从而获得各层单元的误差信号,此误差信号即作为修正各单元权值的依据。这种信号正向传播与误差反向传播的各层权值调整过程,是周而复始地进行的。权值不断调整的过程,也就是网络的学习训练过程。此过程一直进行到网络输出的误差减少到可接受的程度,或进行到预先设定的学习次数为止。

五、实验步骤

       1、首先对手写数字图像进行预处理,包括二值化、去噪、倾斜校正、归一化和特征提取,生成BP神经网络的输入向量m和目标向量target. 其中m选取40×10的矩阵,第1列到第10列代表0~9的数字.target为9×10的单位矩阵,每个数字在其所排顺序位置输出1,其他位置输出0.

       2、然后神经网络的训练过程是识别字符的基础,直接关系到识别率的高低。输送训练样本至BP神经网络训练, 在梯度方向上反复调整权值使网络平方和误差最小。学习方法采用最速下降方法,输入结点数为16*16=256,隐层传输函数为sigmoid函数(logsig),一个输出结点,输出传输函数为pureline(purelin),隐层结点数为sqrt(256+1)+a(a=1~10),取为25。训练完毕, 把待识别数字送BP神经网络中进行仿真测试。

六、实验具体过程

            1. 构造训练样本集。也构成训练输入样本和目标矢量。通过画图工具,获得数字0~9的图像:(0,10,20,30,40,50 ,60,70,80,90).bmp中存放0的不同写法,(1,11,21,31,41,51 ,61,71,81,91).bmp中存放1的不同写法,…

 

实验程序如下:

clear all;

'正在生成输入向量和目标向量,请稍等...'

for kk=0:99

    p1=ones(16,16);

    m=strcat(int2str(kk),'.bmp');

    x=imread(m,'bmp');

    bw=im2bw(x,0.5);

    [i,j]=find(bw==0);

    imin=min(i);

    imax=max(i);

    jmin=min(j);

    jmax=max(j);

    bwl=bw(imin:imax,jmin:jmax);

    rate=16/max(size(bwl));

    bwl=imresize(bwl,rate); [i,j]=size(bwl);

i1=round((16-i)/2);

 j1=round((16-j)/2);

 p1(i1+1:i1+i,j1+1:j1+j)=bwl;

 p1=-1.*p1+ones(16,16);

 %以图象数据形成神经网络输入向量

 for m=0:15

p(m*16+1:(m+1)*16,kk+1)=p1(1:16,m+1);

 end

 %形成神经网络目标向量

 switch kk

   case{0,10,20,30,40,50,60,70,80,90}

             t(kk+1)=0;

   case{1,11,21,31,41,51,61,71,81,91}

             t(kk+1)=1;

   case{2,12,22,32,42,52,62,72,82,92}

             t(kk+1)=2;

   case{3,13,23,33,43,53,63,73,83,93}

             t(kk+1)=3;

   case{4,14,24,34,44,54,64,74,84,94}

             t(kk+1)=4;

   case{5,15,25,35,45,55,65,75,85,95}

             t(kk+1)=5;

   case{6,16,26,36,46,56,66,76,86,96}

             t(kk+1)=6;

   case{7,17,27,37,47,57,67,77,87,97}

             t(kk+1)=7;

   case{8,18,28,38,48,58,68,78,88,98}

             t(kk+1)=8;

   case{9,19,29,39,49,59,69,79,89,99}

             t(kk+1)=9;

  end

end

save E52PT p t;

'输入向量和目标向量生成结束!'

            2. 图像预处理. 截取数字图像向素值为0(黑)的最大矩形区域,将该区域的图像经过变换,成为16*16的二值图像。然后将该二值图像进行反色处理,得到图像个像素的数值0、1构成神经网络的输入向量。所有训练样本和测试样本图像都必须经过这样的处理。

%Example52Tr

clear all;

load E52PT p t;

%创建BP网络

pr(1:256,1)=0;

pr(1:256,1)=0;

pr(1:256,2)=1;

net=newff(pr,[251],{'logsig' 'purelin'},'traingdx','learngdm');

%设置训练参数和训练BP网络

net.trainParam.epochs=2500;

net.trainParam.goal=0.001;

net.trainParam.show=10;

net.trainParam.lr=0.05;

net=train(net,p,t);

%存储训练后的BP网络

save E52net net;

          3. 构造BP神经网络。输入结点数为16*16=256,隐层传输函数为sigmoid函数(logsig),一个输出结点,输出传输函数为pureline(purelin),隐层结点数为sqrt(256+1)+a(a=1~10),取为25,学习方法采用最速下降方法。

%Example52Sim

clear all;

p(1,256,1)=1;

p1=ones(16,16);

load E52net net;

test=input('Please input a test image:','s');

x=imread(test,'bmp');

bw=im2bw(x,0.5);

[i,j]=find(bw==0);

imin=min(i);

imax=max(i);

jmin=min(j);

jmax=max(j);

bw1=bw(imin:imax,jmin:jmax);

rate=16/max(size(bw1));

bw1=imresize(bw1,rate);

[i,j]=size(bw1);

i1=round((16-i)/2);

j1=round((16-j)/2);

p1(i1+1:i1+i,j1+1:j1+j)=bw1;

p1=-1.*p1+ones(16,16);

for m=0:15

   p(m*16+1:(m+1)*16,1)=p1(1:16,m+1);

end

[a,Pf,Af]=sim(net,p);

imshow(p1);

a=round(a)
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值