zoukankan      html  css  js  c++  java
  • FPGA 机器学习之BP神经网络3

                   上一遍写到了,公式,或者是一下关于BP神经网络的内容的语言描述。下面就要开始,进行深度点的分析。

                  一下是matlab程序。多验证下,结合视频和文本资料,可以对BP神经网络有一个新的认识。

    clc
    clear
    %P=-1:0.1:1;
    %T=[-0.96 -0.577 -0.0729 0.377 0.641 0.66 0.461 0.1336 -0.201 -0.434 -0.5 -0.393 -0.1647 0.0988 0.3072...
    %    0.396 0.3449 0.1816 -0.0312 -0.2183 -0.3201];

    P=linspace(0.5,0.6,21);    % 前两个是起始,最后是份数。
    x1=0:pi/40:0.5*pi;
    T=0.99*sin(x1);

    %plot (P,T,'r+');
    %for w=1:10
    net = newff (minmax(P),[4,1],{'logsig','purelin'},'traingdx');
    %net = newff (minmax(P),[1,4,1],{'logsig','tansig','purelin'},'traingdx');  %双隐层结构
    %net = newcf (minmax(P),[1,5,1],{'logsig','tansig','purelin'},'traingdx');
    %newcf这个性能更好。建立的神经网络不一样。
    net.trainParam.epochs=20000;%训练的最大次数
    net.trainParam.goal=0.0002;%训练的最小均方误差
    net.trainParam.lr=0.05;%学习率
    [net,tr]=train(net,P,T);
    Y=sim(net,P);
    plot(P,Y,'r-')
    hold
    plot(P,T,'r+');
    hold off;
    %pause (1);
    %figure;
    %w=w+1;
    %V1(1:4,w) = net.iw{1,1};%输入层到中间层的权值
    %b1(1:4,w) = net.b{1,1};%中间层的阈值
    %W1(w,1:4) = net.lw{2,1};%中间层到输出层的权值
    %b2(w,1:4) = net.b{2,1};%输出层的阈值
    V1 = net.iw{1,1}
    b1 = net.b{1,1}
    W1 = net.lw{2,1}
    b2 = net.b{2,1}
    %end
    %iw(1, j )  表示第 j 个输入矢量在输入层和隐含层中的权值。
    %lw(2,1) :第 1 个输入矢量在隐含层和输出层中的权值。。。。

    这个是我在验证过程中,使用的例子。这个例子是直接调用了,matlab的神经网络函数。通过这个例子,你可以更好的理解,神经网络。matlab自带的神经网络函数很多。可以感受一下,不同的神经网络有什么样的不同。结合文本资料,体会的就更深入。

    newcf   创建级联前向网络
    newff   创建前向BP网络
    newffd   创建存在输入延迟的前向网络
    传递函数:
    logsig   S型的对数函数
    dlogsig   logsig的导函数
    tansig   S型的正切函数
    dtansig   tansig的导函数
    purelin   纯线性函数
    dpurelin   purelin的导函数
    学习函数:
    learngd   基于梯度下降法的学习函数
    learngdm   梯度下降动量学习函数
    训练函数:  
    trainbrBayes  规范化BP训练函数
    trainc   循环顺序渐增训练函数
    traincgb   Powell-Beale连接梯度BP训练函数
    traincgf   Fletcher-Powell连接梯度BP训练函数
    traincgp   Polak-Ribiere连接梯度BP训练函数
    traingda  自适应lrBP的梯度递减训练函数
    traingdx   动量及自适应lrBP的梯度递减训练函数
    trainlm   Levenberg-Marquardt BP训练函数
    trainoss   一步正切BP训练函数
    trainr   随机顺序递增更新训练函数
    trainrp   带反弹的BP训练函数
    trains   顺序递增BP训练函数    
    trainscg   量化连接梯度BP训练函数

    性能函数:
    mse   均方误差函数
    msereg   均方误差规范化函数
    显示函数:
    plotperf   绘制网络的性能
    plotes   绘制一个单独神经元的误差曲面
    plotep   绘制权值和阈值在误差曲面的位置
    errsurf   计算单个神经元的误差曲面

    这里是一些,对应的matlab函数。

    有一些论文表示,

    从一个论文里面,隐层节点数的估计是,                     输入节点数加上输出节点数a1—10之间。

    目前我所查找到的资料,这个是用的最普遍的。(但都是统计学而已。并没有精确的理论推理和验证)

    对应这个结论,我做了一下的一些测试。(大部分用的都是上面的matlab程序)

    这里我就不一张一张的贴出来,我测试的内容了。

    因为我做的测试很多。不好这么麻烦的贴出来。

    总结:

    中间层是5这个是newcf最好的情况。

    中间层是 4 这个是newff最好的情况。

    但是如果中间层是21,或者是31的话,中间层愈多越快。10秒钟就可以收敛。(和学习率有关,但是关系不大)

    有论文说,隐层多也会使收敛的时间长(目前测试不出来)

    对应学习率的测试:

    0.035363次。 0.055006次。0.065559次。0.15908次(不同情况下,相同情况的迭代次数也不一样)

    0.045290次(第二次5849)。

    还有很多都是贴图的。就不在这里贴出来了。因为这里涉及到,随机初始点的随机性。也会影响结果。我记得我还测试了其他的数据。暂时找不到了。

    关于隐层有几层的问题,其他论文的数据都是3层最合适。就是说只有1个隐层。但是少量的数据显示2个隐层也可以。输入数据归一化。

    据查到是资料表示,BP神经网络是需要很多经验性的东西。可是到目前为止,测试的情况来看,我还没有分析到任何可靠的经验。

    也就没有什么所谓的经验可以说了。

    微笑本人能力有限,但是我努力学的更好,分享的更多。只能做到这些了。我会继续努力的

  • 相关阅读:
    我要把铁路修到威斯特摩兰
    1新建空白jasperreport模板
    oracle权限
    swagger配置
    lombok插件基本使用
    oracle与sqlserver的区别
    yaml语法学习
    第一个SpringBoot
    spring多环境切换
    JSR303数据校验
  • 原文地址:https://www.cnblogs.com/maohuawang/p/3807217.html
Copyright © 2011-2022 走看看