神经网络3,主要是一些用matlab自带函数来完成神经网络的例子。matlab自带的函数,都是经过优化,而且函数的实现过程是被封装好了点。性能也是非常的优良了。可是自己写出来的BP神经网络可能就不能达到那样的效果。要想在FPGA上实现,或者要知道内部的运行情况,还是要自己写才行。

          这个是自己写的BP神经网络(网上下的)。

clear all
 clc
 inputNums=3; %输入层节点
 outputNums=3; %输出层节点
 hideNums=10; %隐层节点数
 maxcount=20000; %最大迭代次数
 samplenum=10; %一个计数器,无意义
 precision=0.001; %预设精度
 yyy=1.3; %yyy是帮助网络加速走出平坦区 alpha=0.01; %学习率设定值
 a=0.5; %BP优化算法的一个设定值,对上组训练的调整值按比例修改 字串9 
 error=zeros(1,maxcount+1); %error数组初始化;目的是预分配内存空间
 errorp=zeros(1,samplenum); %同上v=rand(inputNums,hideNums); %3*10;v初始化为一个3*10的随机归一矩阵; v表输入层到隐层的权值
 deltv=zeros(inputNums,hideNums); %3*10;内存空间预分配
 dv=zeros(inputNums,hideNums); %3*10; w=rand(hideNums,outputNums); %10*3;同V
 deltw=zeros(hideNums,outputNums);%10*3
 dw=zeros(hideNums,outputNums); %10*3%samplelist=[0.1323,0.323,-0.132;0.321,0.2434,0.456;-0.6546,-0.3242,0.3255]; %3*3;指定输入值3*3(实为3个向量)
 %expectlist=[0.5435,0.422,-0.642;0.1,0.562,0.5675;-0.6464,-0.756,0.11]; %3*3;期望输出值3*3(实为3个向量),有导师的监督学
 samplelist=[0.8,0.8,-0.8;0.8,-0.8,0.8;-0.8,0.8,0.8;-0.8,0.8,0.8;-0.8,-0.8,-0.8;-0.8,0.8,-0.8;0.8,-0.8,-0.8;0.8,0.8,0.8;-0.8,0.8,0.8;-0.8,0.8,-0.8];
 expectlist=[0.5,0.5,0.1; 0.5,0.1,0.5; 0.1,0.5,0.5;  0.1,0.5,0.5; 0.1,0.1,0.1  ; 0.1,0.5,0.1; 0.5,0.1,0.1;  0.5,0.5,0.5; 0.1,0.5,0.5; 0.1,0.5,0.1];count=1;
 while (count<=maxcount) %结束条件1迭代20000次
  c=1;
  while (c<=samplenum)
   for k=1:outputNums 
    d(k)=expectlist(c,k); %获得期望输出的向量,d(1:3)表示一个期望向量内 的值
   end
  
   for i=1:inputNums
    x(i)=samplelist(c,i); %获得输入的向量(数据),x(1:3)表一个训练向量
   end
  
 %For ward();
   for j=1:hideNums
    net=0.0;
    for i=1:inputNums
     net=net+x(i)*v(i,j);%输入层到隐层的加权和∑X(i)V(i) 
    end
    y(j)=1/(1+exp(-net)); %输出层处理f(x)=1/(1+exp(-x))单极性sigmiod函数
   end
   for k=1:outputNums
    net=0.0;
    for j=1:hideNums
    net=net+y(j)*w(j,k);
    end
    if count>=2&&error(count)-error(count+1)<=0.0001
     o(k)=1/(1+exp(-net)/yyy); %平坦区加大学习率
    else 
     o(k)=1/(1+exp(-net)); %同上
    end
   end
  
 %BpE rror(c)反馈/修改;
   errortmp=0.0;
   for k=1:outputNums
    errortmp=errortmp+(d(k)-o(k))^2; %第一组训练后的误差计算
   end
    errorp(c)=0.5*errortmp; %误差E=∑(d(k)-o(k))^2 * 1/2 
   %end
  
 %Bac kward();
   for k=1:outputNums
    yitao(k)=(d(k)-o(k))*o(k)*(1-o(k)); %输入层误差偏导 字串5 
   end
   for j=1:hideNums
    tem=0.0;
    for k=1:outputNums
     tem=tem+yitao(k)*w(j,k); %为了求隐层偏导,而计算的∑
    end
    yitay(j)=tem*y(j)*(1-y(j)); %隐层偏导 
   end%调整各层权值
   for j=1:hideNums
    for k=1:outputNums
     deltw(j,k)=alpha*yitao(k)*y(j); %权值w的调整量deltw(已乘学习率)
     w(j,k)=w(j,k)+deltw(j,k)+a*dw(j,k);%权值调整,这里的dw=dletw(t-1),实际是对BP算法的一个
     dw(j,k)=deltw(j,k); %改进措施--增加动量项目的是提高训练速度 
    end 
   end
   for i=1:inputNums
    for j=1:hideNums
     deltv(i,j)=alpha*yitay(j)*x(i); %同上deltw
     v(i,j)=v(i,j)+deltv(i,j)+a*dv(i,j); 
     dv(i,j)=deltv(i,j);
    end
   end
  c=c+1;
  end%第二个while结束;表示一次BP训练结束 double tmp;
  tmp=0.0; 
  for i=1:samplenum
   tmp=tmp+errorp(i)*errorp(i);%误差求和
  end
  tmp=tmp/c;
  error(count)=sqrt(tmp);%误差求均方根,即精度
  
  if (error(count)<precision)%另一个结束条件
   break;
  end
 count=count+1;%训练次数加1
 end%第一个while结束error(maxcount+1)=error(maxcount);
 p=1:count;
 pp=p/50;  %方便显示用的
 plot(pp,error(p),'-'); %显示误差 xce=[0.7,-0.9,0.8];
 for j=1:hideNums
     net=0.0;
     for i=1:inputNums
         net=net+xce(i)*v(i,j);%输入层到隐层的加权和∑X(i)V(i) 
     end
     y(j)=1/(1+exp(-net)); %输出层处理f(x)=1/(1+exp(-x))单极性sigmiod函数
 end
 for k=1:outputNums
     net=0.0;
     for j=1:hideNums
         net=net+y(j)*w(j,k);
     end
     o(k)=1/(1+exp(-net));
 end
 o

这个只是我其中一个,测试过程的matlab实例。其实在很多的论文里面,都描述了,bp神经网络的不足。有麻痹现象,就是反馈的数据变的很小了(反馈的调整加权值)和收敛到局部最小值就不在收敛了。

%if count>=200 && count <400          %也没有很大的效果
     %    alpha=1;
    % elseif  count>=400 && count <1000
    %    alpha=7;
     %elseif  count>=1000
     %    alpha=10;
     %else
     %    alpha=0.08;
     %end

alpha 是学习速率嘛:如果学习率高的话,可以做到快速收敛,有可能也会引起收敛到局部最小值时的震荡。所以,可以考虑,前期学习率大,让它快速收敛,然后后期学习率小些,避免在最小值附近震荡,无法收敛。

% if y(j) <=0.01       
          %    y(j)=0.01;
           % elseif  y(j) >=0.99
          %      y(j)=0.99;
          %  else
          %      y(j)=y(j);
          %  end

这一段,关于这2段是放在程序的什么地方嘛。自己感觉一下吧。其实这一段程序是为了防止,反馈系数变的很小,如果反馈基本为0的话,调整很多次也不会有效果了。所以,我把数据限定一下,(这个好像是函数限定)。不好意思,不怎么记得了。找不到了。

       无论是自己的调试,修改。还是看很多改进的论文。最终我都没有调试出一个比较好的结果。改进的效果也不是很明显。没有最终版本。

        关于计划的FPGA实现,不好意思。matlab程序,测试了很多,还有很多没测试,改进的。所以还没有轮到那一步。后来就没有时间和精力了。也没有完成。好几个月前了。