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

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

  • 相关阅读:
    [PHP] Layui + jquery 实现 实用的文章自定义标签
    个人总结第五周
    个人总结第四周
    个人总结第三周
    个人总结第二周
    个人总结第一周
    用户体验评价
    第二阶段scrum冲刺
    单词统计
    用户模块和用户场景
  • 原文地址:https://www.cnblogs.com/maohuawang/p/3807216.html
Copyright © 2020-2023  润新知