BP网络

本文通过使用MATLAB实现BP神经网络训练,详细介绍了如何通过图像处理获取特征,并应用于人脸识别的角度分类任务。文中提供了完整的代码示例及网络参数调整说明。

matlab 中文论坛教程之BP网络。

首先说觉得老师讲的确实很好,很清楚。

下面记一下我的听课笔记。

BP:backpropagation was created by generalizing the Widrow-Hoff learning rule to multiple-layer networks and non-linear differential transfer function.

 

多层的话可以将原来不可分的变成可分的。下面这张幻灯片上的理论就是Widrow-Hoff learning rule。这个理论的过程的核心就是减小误差,它是一个从后向前更新权重的过程(back)根据后面的输出依次向前找出权重,由这个rule,得出上面这张幻灯片里的IW和LW。




%从图中可以看出每一组的输入数据有8个,隐藏层有10个神经元,输出层有3个。

function mytest()

clc;
images=[ ];  
M_train=3;%表示人脸
N_train=5;%表示方向 
sample=[];  
pixel_value=[];
sample_number=0;

  for j=1:N_train
      for i=1:M_train
    str=strcat('Images\',num2str(i),'_',num2str(j),'.bmp'); %读取图像,连接字符串形成图像的文件名。
    img= imread(str);  
    [rows cols]= size(img);%获得图像的行和列值。
     img_edge=edge(img,'Sobel');%图像边缘检测

    
     %由于在分割图片中我们可以看到这个人脸的眼睛部分也就是位于分割后的第二行中,位置变化比较大,而且眼睛边缘检测

效果很好
     
     sub_rows=floor(rows/6);%最接近的最小整数,分成6行
     sub_cols=floor(cols/8);%最接近的最小整数,分成8列
     sample_num=M_train*N_train;%前5个是第一幅人脸的5个角度
    
     sample_number=sample_number+1;
     for subblock_i=1:8 %因为这还在i,j的循环中,所以不可以用i 
           block_num=subblock_i;
           pixel_value(sample_number,block_num)=0;  
            for ii=sub_rows:(2*sub_rows)
             for jj=(subblock_i-1)*sub_cols+1:subblock_i*sub_cols
                 pixel_value(sample_number,block_num)=pixel_value(sample_number,block_num)+img_edge(ii,jj);          
             end
            end     
     end  
  end
  end
  %将特征值转换为小于1的值
 max_pixel_value=max(pixel_value);
  max_pixel_value_1=max(max_pixel_value); 
  for i=1:3
      mid_value=10^i;
      if(((max_pixel_value_1/mid_value)>1)&&((max_pixel_value_1/mid_value)<10))
         multiple_num=1/mid_value; 
         pixel_value=pixel_value*multiple_num; 
         break;
      end
  end     
  

% T 为目标矢量 
    t=zeros(3,sample_number);
    %因为有五类,所以至少用3个数表示,5介于2的2次方和2的3次方之间
    for i=1:sample_number
        % if((mod(i,5)==1)||(mod(i,5)==4)||(mod(i,5)==0))
        if(i<=3)||((i>9)&&(i<=12))||((i>12)&&(i<=15))
            t(1,i)=1;
        end    
        %if((mod(i,5)==2)||(mod(i,5)==4)) 
        if((i>3)&&(i<=6))||((i>9)&&(i<=12))
            t(2,i)=1;
        end        
        %if((mod(i,5)==3)||(mod(i,5)==0)) 
        if((i>6)&&(i<=9))||((i>12)&&(i<=15))
            t(3,i)=1;
        end           
    end  
    
    
   

% NEWFF——生成一个新的前向神经网络 
% TRAIN——对 BP 神经网络进行训练 
% SIM——对 BP 神经网络进行仿真 

%  定义训练样本 
% P 为输入矢量 
P=pixel_value'
% T 为目标矢量 
T=t
size(P)
size(T)
% size(P)
% size(T)


%  创建一个新的前向神经网络  
net_1=newff(minmax(P),[10,3],{'tansig','purelin'},'traingdm')
%minmax(P)是找到P的最大值和最小值,作为newff的输入范围。[10,3]中10表示隐藏层里有10个神经元,3表示输出层,在matlab里输入层是不算的。

%从图中可以看出每一组的输入数据有8个,隐藏层有10个神经元,输出层有3个。


%{'tansig','purelin'}代表隐藏层和输出层的决策函数
%查看网络参数
%  当前输入层权值和阈值 
inputWeights=net_1.IW{1,1} 
inputbias=net_1.b{1} 
%  当前网络层权值和阈值 
layerWeights=net_1.LW{2,1} 
layerbias=net_1.b{2} 

%  设置训练参数
net_1.trainParam.show = 50; 
net_1.trainParam.lr = 0.05; 
net_1.trainParam.mc = 0.9; 
net_1.trainParam.epochs = 10000; %每训练1000次后给出一次结果
net_1.trainParam.goal = 1e-3; %设置网络计算出的结果与实际数据的误差小于0.001

%  调用 TRAINGDM 算法训练 BP 网络
[net_1,tr]=train(net_1,P,T); 

%  对 BP 网络进行仿真
A = sim(net_1,P); 
%  计算仿真误差  
E = T - A; 
MSE=mse(E) 

x=[0.14 0 1 1 0 1 1 1.2]';
sim(net_1,x)

web -browser http://www.ilovematlab.cn/thread-18635-1-1.html
matlab命令窗口输出:

    0.8760    0.2398    0.7230   -0.3786   -0.3939   -0.2916    0.2027    0.5061
   -0.3426    0.2428   -0.7280   -0.0987   -0.0049    0.7508   -0.3601    0.1878
   -1.2945    0.3135   -0.6070   -0.5300    0.1616    0.1685    0.0865    0.0832
    0.5795   -0.2162   -0.3885    0.1845   -0.3926    0.1743    0.4385    1.1605
    0.7350    0.0902    0.6849   -0.5076    0.3061   -0.3670   -0.0875    0.8137
    0.9330   -0.3852   -0.1570    0.0690    0.3884   -0.4169    0.4037    0.5951
   -0.9643   -0.4881   -0.3582    0.3003    0.3141   -0.2739   -0.3727   -0.4125
   -0.1345    0.6588   -0.6841   -0.3413    0.0068    0.4994   -0.2025   -0.1347
    0.2900   -0.3836   -0.2626   -0.0870   -0.3240    0.7434    0.0168    0.9228
    0.5420    0.1398   -0.2640    0.0959    0.2984    0.2981   -0.5329   -1.1787




inputbias =


   -2.7755
    1.7289
    2.4978
   -2.0329
   -1.4530
   -1.3784
    1.9494
   -0.9278
    0.9267
    2.2788




layerWeights =


   -0.7805    0.9453   -0.4171    0.2786    0.6765   -0.8779    0.6555   -0.2132   -0.5848    0.3429
   -0.4602    0.4208    0.7007   -0.4893    0.1694    0.1693   -0.6180    0.6531   -0.3638    0.1420
    0.0493   -0.3763    0.8233   -0.8227    0.8962   -0.4298   -0.1149    0.3537   -0.7324   -0.6605




layerbias =


   -0.7047
   -0.0478
    0.8162




MSE =


   9.9959e-04




ans =


    1.0793
   -0.2251
    0.5312









                
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值