FPGA机器学习之BP神经网络4

                    神经网络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程序,测试了很多,还有很多没测试,改进的。所以还没有轮到那一步。后来就没有时间和精力了。也没有完成。好几个月前了。

 

          微笑我能力有限,但是我努力的分享,努力的学习。希望能更多的帮助各位。也希望各位能够努力。

 

 

posted @ 2014-06-14 06:36  my_share  阅读(1107)  评论(0编辑  收藏  举报