matlab实验之基于神经网络识别简单手写数字

  • 实验目的
  1. 通过实验操作进一步掌握人工神经网络的结构、训练与应用;
  2. 掌握反向传播算法;

 3. 熟练使用 Matlab 编写模式识别算法程序。

  • 实验原理

反向传播算法

此次实验延续第一次实验简单识别手写数字的基础,添加鼠标移动,画图,等代码请参考上次,

简单的手写识别

本次实验直接重复延用。

  • 实验内容

1:将实验一的pattern.mat数据转化为100*25的数据

,写一个函数(下代码图为脚本,请自行封装成函数,不写成函数也可以,其代码目的功能是得到stdpattern名的.mat文件。)将其转化为70*25的训练样本和30*25的测试样本。

clear all;clc;
load('pattern.mat');
nClass=10;
nDim= 25;
trN=7;
train_x= [];
train_y = [];
test_x =[];
test_y=[];
zerolabel = zeros(1,nClass);
for i =1:nClass

    [~,N]= size(pattern(1,i).feature);
    tmplabel =zerolabel;
    tmplabel(i)=1;
       for j=1:trN
      tmp = pattern(1,i).feature(:,j);
      train_x = [train_x;tmp'];
      train_y = [train_y;tmplabel];
         end
    
        for j=trN+1:N
            tmp =pattern(1,i).feature(:,j);
            test_x=[test_x;tmp'];
            test_y =[test_y;tmplabel];
        end
        
end
        save ('stdpattern.mat','train_x','train_y','test_x','test_y');













2:写sigama函数

Sigama函数作为神经元分类的界限,分出1和0,并为后面 标签对应1000000000对应标签0,0100000000对应标签1 一直到0000000001对应标签9做基础。

function [y] =Sigama(x)
%UNTITLED 此处显示有关此函数的摘要
%   此处显示详细说明
y=1./(1+exp(-1.*x));
end

3:添加神经识别按钮并且编写回调函数

3.1

添加按钮后 进入回调函数添加训练样本的代码与识别代码。

 

 

 

3.2: 添加获取当前手写图片数据

3.3:

传入手写样本数据后 更具梯度公式得出输出

其中输入为curFea代入ts_x,nn.a{3}中的最大值,其所对应的列下标减1,即为需要求出的标签

整合后神经识别按钮回调函数里的总代码:

function pushbutton6_Callback(hObject, eventdata, handles)
clc;

load('stdpattern.mat');  %加载转换格式后的样本数据,

nn.size=[25,100,10]; %25个输入,100个隐藏神经元,10个输出,对应10个标签。
nn.learningRate= 0.5;
nn.W{1}=rand(nn.size(2),nn.size(1))-0.5;
nn.b{1}=zeros(1,nn.size(2));
nn.W{2}= rand (nn.size(3),nn.size(2))-0.5;
nn.b{2}=zeros(1,nn.size(3));
%train net  训练神经元网络 ,不断更新梯度和公式得到最终公式。
tr_num=size(train_x,1);
Epochs=20;
Losts= zeros(Epochs,1);
for iter =1:Epochs   %Epochs为训练次数
Lost=0;
    kk=randperm(tr_num);
    for i =1: tr_num  %循环训练样本
        x=train_x(kk(i),:);
        y=train_y(kk(i),:);
      
    nn.a{1}=x;  %输入单元
        nn.a{2}=Sigama(nn.a{1}*nn.W{1}'+nn.b{1}); %隐藏单元的计算
         nn.a{3}=Sigama(nn.a{2}*nn.W{2}'+nn.b{2});%神经元的输出
         
         L=(1/2)*sum((nn.a{3}-y).^2);
         
         %梯度的更新
         nn.d{3}=-(y-nn.a{3}).*nn.a{3}.*(1-nn.a{3});
         nn.d{2}=nn.a{2}.*(1-nn.a{2}).*(nn.d{3}*nn.W{2});    
         
         nn.W{2}=nn.W{2}-nn.learningRate*nn.d{3}'*nn.a{2};
         nn.b{2}=nn.b{2}-nn.learningRate*nn.d{3};
         nn.W{1}=nn.W{1}-nn.learningRate*nn.d{2}'*nn.a{1};
         nn.b{1}=nn.b{1}-nn.learningRate*nn.d{2};
         
         Lost =Lost +L;
         
         
    end

    
    avrLost = Lost/tr_num;
    Losts(iter)=avrLost;
    
end
% plot(Losts);

px = getframe(handles.axes1); %获取当前手写图片的矩阵数据
curImg  = frame2im(px);
curFea=getbfunction(curImg,5,5);%调用函数function 读取curimg的所有像素,
                                                            %分成5*5得出一个矩阵记录255占比



%test
ts_num = size (test_x,1);
NumOfCorrect = 0;

    ts_x=curFea'; %传入矩阵,转置成一行25列的矩阵
    
    
     nn.a{1}=ts_x;
        nn.a{2}=Sigama(nn.a{1}*nn.W{1}'+nn.b{1});
         nn.a{3}=Sigama(nn.a{2}*nn.W{2}'+nn.b{2});
         [~,i]= max(nn.a{3});
        
         
Accuracy = NumOfCorrect /ts_num;
% fprintf('The accracy is %f\n',Accuracy);
fprintf('手写神经识别为:%d',i-1);
    


  • 心得体会

        要提前做准备,理清好神经网络的原理,梯度的更新,神经元的输入和输出,隐藏单元对应的权值,用合适合理的矩阵装载,公式一一对应,方便后面的代码实现和公式的一步步编写。

        可以看出相比第一次用欧拉公式求距离来匹配,神经元的优势在于给出梯度更新的公式,不断的去更新给于的数据最终得到一条比较精准可以求出目的标签的公式,再对于新来的手写样本,其带入公式,即可马上求出对应标签。其中手写样本我们将其分为了25块小格,1*25的矩阵,相当于25维的数据。25个数据同时作为神经元25的输入端,最终得出10个输出端。10个输出端放置为0000000000,每位可以为0或者1,例如全零可以被我们默认认为代表数字0,赋予标签即可,010000000,为数字1。

          其中本次实验的难点在于搞懂神经元梯度更新的原理,设有一个完美的函数,能够满足我们的需求,只需要将1*25的数据,也就是这个手写样本的特征 作为25个输入,就能通过这条公式得到最终的10个输出,然后我们就知道其标签。那么这条公式该怎么求?则利用梯度更新不断重复不端逼近不断寻找这条函数。最终更新完毕后不再变化。

        我水平有限,仅以此记录学习过程。仅供参考。以上为个人目前见解,更多资料请上网寻找。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值