zoukankan      html  css  js  c++  java
  • 深度学习之BP神经网络

    模型、策略、算法:

      在深度学习中,无论多么复杂的结构,终究逃不过三种构造,那就是模型、策略、算法,它们都是在这三种结构基础上进行的变形、扩展、丰富

      模型:构建参数、函数,确定学习方式

      策略:策略的重点时损失函数,即构造出一种能都使得损失最小的函数结构

      算法:不断迭代,深度学习

    BP神经网络基本概念:

      BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。它模拟了人脑的神经网络的结构,而人大脑传递信息的基本单位是神经元,人脑中有大量的神经元,每个神经元与多个神经元相连接。BP神经网络,类似于上述,是一种简化的生物模型。每层神经网络都是由神经元构成的,单独的每个神经元相当于一个感知器。输入层是单层结构的,输出层也是单层结构的,而隐藏层可以有多层,也可以是单层的。输入层、隐藏层、输出层之间的神经元都是相互连接的,为全连接。总得来说,BP神经网络结构就是,输入层得到刺激后,会把他传给隐藏层,至于隐藏层,则会根据神经元相互联系的权重并根据规则把这个刺激传给输出层,输出层对比结果,如果不对,则返回进行调整神经元相互联系的权值。这样就可以进行训练,最终学会,这就是BP神经网络模型。

    BP神经网络简介:

    BP神经网络已广泛应用于非线性建摸、函数逼近、系统辨识等方面,但对实际问题,其模型结构需由实验确定,无规律可寻。大多数通用的神经网络都预先预定了网络的层数,而BP网络可以包含不同的隐层。但理论上已经证明,在不限制隐含节点数的情況下,两层(只有一个隐层)的BP网络可以实现任意非线性映射。在模式样本相对较少的情況下,较少的隐层节点,可以实现模式样本空间的超平面划分,此时,选择两层BP网络就可以了。当模式样本数很多时,减小网络规模,增加一个隐层是有必要的,但是BP网络隐含层数一般不超过两层。

     

    BP神经网络训练流程图:

     

     BP神经网络算法公式:

    在三层BP神经网络中,输入向量,也就是输入层神经元为:

     

    隐藏层输入向量,也就是隐藏层神经元:
     

    输出层输出向量,也就是输出层神经元:
     

    期望输出向量可以表示为:

     

    输入层到隐藏层之间的权值用数学向量可以表示为:

     

    这里面的列向量vj为隐藏层第 j 个神经元对应的权重;隐藏层到输出层之间
    的权值用数学向量可以表示为:

     

      上式中的列向量wk为输出层第 k 个神经元对应的权重。
    输入层,隐藏层,输出层之间的数学关系如下所示:
               就输出层而言

     

     

    就隐藏层而言
     

    在上述表达式中,激活函数 f(x)必须为单调函数,我们选取 sigmoid 函数:
     

    这是由于 f(x)是连续函数,是可导函数,且f'(x)=f(x)[1-f(x)]。

     BP 神经网络的输入误差产生是由于输出层到隐藏层的权值和隐藏层到输入层的权值决定,因此调整输出层到隐藏层的权值和隐藏层到输入层的权值可以改变误差。调整输出层到隐藏层的权值和隐藏层到输入层的权值的思想是让这个误差不断缩小这样才能满足我们的要求,因此我们需要让这些权值修改量与误差 E 的负梯度下降量成正比。

    通过数学原理可以看出,在 BP 学习算法中,输入层,输出层和隐藏层权值调整方式都是一样的。由三个条件决定,它们分别是:学习效率,输入层,输出层和隐藏层的各层误差信号和各层输入信号 X/Y。其中最为重要的是输出层误差信号,它直接意味着和实际期望结果的差异,代表着与我们预期结果的差距,而前面的各层的误差都是从后往前传递计算的误差。

      

    BP神经网络优缺点:

     优点:

    • 网络实质上实现了一个从输入到输出的映射功能,而数学理论已证明它具有实现任何复杂非线性映射的功能。因此它特别适合于求解内部机制复杂的问题;
    • 网络具有自学习能力;
    • 网络具有一定的推广、概括能力。

      缺点:

    • BP算法的学习速度很慢

    • 网络训练失败的可能性较大

    BP神经网络构建代码:

    % BP网络
    % BP神经网络的构建
    net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
    net.IW{1}
    net.b{1}
    
    p=[1;2];
    a=sim(net,p)
    net=init(net);
    net.IW{1}
    net.b{1}
    a=sim(net,p)
    %net.IW{1}*p+net.b{1}
    p2=net.IW{1}*p+net.b{1}
    a2=sign(p2)
    a3=tansig(a2)
    a4=purelin(a3)
    net.b{2}
    net.b{1}
    
    net.IW{1}
    net.IW{2}
    0.7616+net.b{2}
    a-net.b{2}
    (a-net.b{2})/ 0.7616
    help purelin
    
    p1=[0;0];
    a5=sim(net,p1)
    net.b{2}
    % BP网络
    % BP神经网络的构建
    net=newff([-1 2;0 5],[3,1],{'tansig','purelin'},'traingd')
    net.IW{1}
    net.b{1}
    %p=[1;];
    p=[1;2];
    a=sim(net,p)
    net=init(net);
    net.IW{1}
    net.b{1}
    a=sim(net,p)
    net.IW{1}*p+net.b{1}
    p2=net.IW{1}*p+net.b{1}
    a2=sign(p2)
    a3=tansig(a2)
    a4=purelin(a3)
    net.b{2}
    net.b{1}
    
    
    
    
    P=[1.2;3;0.5;1.6]
    W=[0.3 0.6 0.1 0.8]
    net1=newp([0 2;0 2;0 2;0 2],1,'purelin');
    net2=newp([0 2;0 2;0 2;0 2],1,'logsig');
    net3=newp([0 2;0 2;0 2;0 2],1,'tansig');
    net4=newp([0 2;0 2;0 2;0 2],1,'hardlim');
    
    net1.IW{1}
    net2.IW{1}
    net3.IW{1}
    net4.IW{1}
    net1.b{1}
    net2.b{1}
    net3.b{1}
    net4.b{1}
    
    
    net1.IW{1}=W;
    net2.IW{1}=W;
    net3.IW{1}=W;
    net4.IW{1}=W;
    
    a1=sim(net1,P)
    a2=sim(net2,P)
    a3=sim(net3,P)
    a4=sim(net4,P)
    
    init(net1);
    net1.b{1}
    
    help tansig
    
    % 训练
    p=[-0.1 0.5]
    t=[-0.3 0.4]
    w_range=-2:0.4:2;
    b_range=-2:0.4:2;
    
    ES=errsurf(p,t,w_range,b_range,'logsig');%单输入神经元的误差曲面
    plotes(w_range,b_range,ES)%绘制单输入神经元的误差曲面
    pause(0.5);
    hold off;
    net=newp([-2,2],1,'logsig');
    net.trainparam.epochs=100;
    net.trainparam.goal=0.001;
    figure(2);
    [net,tr]=train(net,p,t);
    title('动态逼近')
    wight=net.iw{1}
    bias=net.b
    pause;
    close;
    % 练
    p=[-0.2 0.2 0.3 0.4]
    t=[-0.9 -0.2 1.2 2.0]
    h1=figure(1);
    net=newff([-2,2],[5,1],{'tansig','purelin'},'trainlm');
    net.trainparam.epochs=100;
    net.trainparam.goal=0.0001;
    net=train(net,p,t);
    a1=sim(net,p)
    pause;
    h2=figure(2);
    plot(p,t,'*');
    title('样本')
    title('样本');
    xlabel('Input');
    ylabel('Output');
    pause;
    hold on;
    ptest1=[0.2 0.1]
    ptest2=[0.2 0.1 0.9]
    a1=sim(net,ptest1);
    a2=sim(net,ptest2);
    
    net.iw{1}
    net.iw{2}
    net.b{1}
    net.b{2}

    matlab运行结果:

    BP神经网络与感知器神经网络构建:

    % 第一章  感知器
    % 1. 感知器神经网络的构建
    % 1.1  生成网络
    net=newp([0 2],1);%单输入,输入值为[0,2]之间的数
    inputweights=net.inputweights{1,1};%第一层的权重为1
    biases=net.biases{1};%阈值为1
    % 1.2  网络仿真
    
    net=newp([-2 2;-2 2],1);%两个输入,一个神经元,默认二值激活
    net.IW{1,1}=[-1 1];%权重,net.IW{i,j}表示第i层网络第j个神经元的权重向量
    net.IW{1,1}
    net.b{1}=1;
    net.b{1}
    p1=[1;1],a1=sim(net,p1)
    p2=[1;-1],a2=sim(net,p2)
    p3={[1;1] [1 ;-1]},a3=sim(net,p3) %两组数据放一起
    p4=[1 1;1 -1],a4=sim(net,p4)%也可以放在矩阵里面
    net.IW{1,1}=[3,4];
    net.b{1}=[1];
    a1=sim(net,p1)
    % 1.3  网络初始化
    net=init(net);
    wts=net.IW{1,1}
    bias=net.b{1}
    % 改变权值和阈值为随机数
    net.inputweights{1,1}.initFcn='rands';
    net.biases{1}.initFcn='rands';
    net=init(net);
    bias=net.b{1}
    wts=net.IW{1,1}
    a1=sim(net,p1)
    
    % 2. 感知器神经网络的学习和训练
    % 1 网络学习
    net=newp([-2 2;-2 2],1);
    net.b{1}=[0];
    w=[1 -0.8]
    net.IW{1,1}=w;
    p=[1;2];
    t=[1];
    a=sim(net,p)
    e=t-a
    help learnp
    dw=learnp(w,p,[],[],[],[],e,[],[],[],[],[])
    w=w+dw
    net.IW{1,1}=w;
    a=sim(net,p)
    
    
    net = newp([0 1; -2 2],1);
    P = [0 0 1 1; 0 1 0 1];
    T = [0 1 1 1];
    Y = sim(net,P)
    net.trainParam.epochs = 20;
    net = train(net,P,T);
    Y = sim(net,P)
    
    
    % 2 网络训练
    net=init(net);
    p1=[2;2];t1=0;p2=[1;-2];t2=1;p3=[-2;2];t3=0;p4=[-1;1];t4=1;
    net.trainParam.epochs=1;
    net=train(net,p1,t1)
    w=net.IW{1,1}
    b=net.b{1}
    a=sim(net,p1)
    net=init(net);
    p=[[2;2] [1;-2] [-2;2] [-1;1]];
    t=[0 1 0 1];
    net.trainParam.epochs=1;
    net=train(net,p,t);
    a=sim(net,p)
    net=init(net);
    net.trainParam.epochs=2;
    net=train(net,p,t);
    a=sim(net,p)
    net=init(net);
    net.trainParam.epochs=20;
    net=train(net,p,t);
    a=sim(net,p)
    
    % 3. 二输入感知器分类可视化问题
    P=[-0.5 1 0.5 -0.1;-0.5 1 -0.5 1];
    T=[1 1 0 1]
    net=newp([-1 1;-1 1],1);
    plotpv(P,T);
    plotpc(net.IW{1,1},net.b{1});
    %hold on;
    %plotpv(P,T);
    net=adapt(net,P,T);
    net.IW{1,1}
    net.b{1}
    plotpv(P,T);
    plotpc(net.IW{1,1},net.b{1})
    net.adaptParam.passes=3;
    net=adapt(net,P,T);
    net.IW{1,1}
    net.b{1}
    plotpc(net.IW{1},net.b{1})
    net.adaptParam.passes=6;
    net=adapt(net,P,T)
    net.IW{1,1}
    net.b{1}
    plotpv(P,T);
    plotpc(net.IW{1},net.b{1})
    
    plotpc(net.IW{1},net.b{1})
    %仿真
    a=sim(net,p);
    plotpv(p,a)
    
    p=[0.7;1.2]
    a=sim(net,p);
    plotpv(p,a);
    hold on;
    plotpv(P,T);
    plotpc(net.IW{1},net.b{1})
    %感知器能够正确分类,从而网络可行。
    
    % 4. 标准化学习规则训练奇异样本
    P=[-0.5 -0.5 0.3 -0.1 -40;-0.5 0.5 -0.5 1.0 50]
    T=[1 1 0 0 1];
    net=newp([-40 1;-1 50],1);
    plotpv(P,T);%标出所有点
    hold on;
    linehandle=plotpc(net.IW{1},net.b{1});%画出分类线
    E=1;
    net.adaptParam.passes=3;%passes决定在训练过程中训练值重复的次数。
    while (sse(E))
        [net,Y,E]=adapt(net,P,T);
        linehandle=plotpc(net.IW{1},net.b{1},linehandle);
        drawnow;
    end;
    axis([-2 2 -2 2]);
    net.IW{1}
    net.b{1}
    %另外一种网络修正学习(非标准化学习规则learnp)
    hold off;
    net=init(net);
    net.adaptParam.passes=3;
    net=adapt(net,P,T);
    plotpc(net.IW{1},net.b{1});
    axis([-2 2 -2 2]);
    net.IW{1}
    net.b{1}
    %无法正确分类
    %标准化学习规则网络训练速度要快!
    
    % 训练奇异样本
    % 用标准化感知器学习规则(标准化学习数learnpn)进行分类
    net=newp([-40 1;-1 50],1,'hardlim','learnpn');
    plotpv(P,T);
    linehandle=plotpc(net.IW{1},net.b{1});
    e=1;
    net.adaptParam.passes=3;
    net=init(net);
    linehandle=plotpc(net.IW{1},net.b{1});
    while (sse(e))
    [net,Y,e]=adapt(net,P,T);
    linehandle=plotpc(net.IW{1},net.b{1},linehandle);
    end;
    axis([-2 2 -2 2]);
    net.IW{1}%权重
    net.b{1}%阈值
    %正确分类
    
     %非标准化感知器学习规则训练奇异样本的结果
    net=newp([-40 1;-1 50],1);
    net.trainParam.epochs=30;
    net=train(net,P,T);
    pause;
    linehandle=plotpc(net.IW{1},net.b{1});
    hold on;
    plotpv(P,T);
    linehandle=plotpc(net.IW{1},net.b{1});
    axis([-2 2 -2 2]);
    
    % 5. 设计多个感知器神经元解决分类问题
    p=[1.0 1.2 2.0 -0.8; 2.0 0.9 -0.5 0.7]
    t=[1 1 0 1;0 1 1 0]
    plotpv(p,t);
    hold on;
    net=newp([-0.8 1.2; -0.5 2.0],2);
    linehandle=plotpc(net.IW{1},net.b{1});
    net=newp([-0.8 1.2; -0.5 2.0],2);
    linehandle=plotpc(net.IW{1},net.b{1});
    e=1;
    net=init(net);
    while (sse(e))
    [net,y,e]=adapt(net,p,t);
    linehandle=plotpc(net.IW{1},net.b{1},linehandle);
    drawnow;
    end;

    matlab运行结果:

    参考网址:

    利用C++语言实现BP神经网络, 并利用BP神经网络解决螨虫分类问题:https://blog.csdn.net/u25th_engineer/article/details/100167404

  • 相关阅读:
    centOS7 查看防火墙状态 开放端口
    PHP之Trait详解 转
    ps 树形显示
    composer 打印美化
    第一章 Java Web应用开发技术
    团队博客20
    团队博客19
    团队博客18
    团队博客17
    团队博客16
  • 原文地址:https://www.cnblogs.com/bokeyuancj/p/11585756.html
Copyright © 2011-2022 走看看