精华内容
下载资源
问答
  • 多层bp神经网络matlab
    千次阅读
    2021-04-20 14:59:53

    最近研究神经网络。BP网络是最经典最常用的神经网络。Matlab 有专门的工具箱用来实现 BP 算法。我用matlab语言重新实现BP算法,以便加深对该算法的理解程度。程序有点粗糙,只是为了实现算法。当然可以加上一些绘图命令来可视化神经网络学习过程。

    % BP net R^m->R^h->R^n

    %

    sigmoid=@(x)1./(1+exp(-x));

    % input : X,T

    %x1=linspace(-1,1,5);x2=x1;

    %[x2,x1]=meshgrid(x2,x1);

    %X=[x1(:).';x2(:).'];

    %T=sigmoid(3*X(1,:)+2*X(2,:)-1);

    X=[[1;1],[1;0],[0;1],[0;0]];T=[1,0,0,0];

    % parameters

    [m,N]=size(X);h=3;[n,M]=size(T); % N==M

    tol=1e-4;

    lr=0.2; % learning rate

    % initial value

    W=rand(h,m);theta=rand(h,1);

    V=rand(n,h);eta=rand(n,1);

    % algorithm

    Z=sigmoid(W*X-repmat(theta,1,N));

    Y=V*Z-repmat(eta,1,N);

    E=T-Y;

    k=0;

    %DW0=rand(1,m);DT0=0;

    %Da0=0;Db0=0;

    while(norm(E,'fro')>tol&&k<30000)

    % lr=0.01/(1+k/500);

    V=V+lr*(T-Y)*Z.';

    eta=eta-lr*sum(T-Y,2);

    D=V.'*(T-Y);

    W=W+lr*(D.*Z.*(1-Z))*X.';

    theta=theta-lr*sum(D.*Z.*(1-Z),2);

    Z=sigmoid(W*X-repmat(theta,1,N));

    Y=V*Z-repmat(eta,1,N);

    E=T-Y;

    k=k+1;

    end

    % output

    norm(E,'fro')

    更多相关内容
  • 简单的bp神经网络 matlab实现代码 程序,可供参考 按照误差逆向传播算法训练的多层前馈神经网络
  • BP神经网络matlab代码

    2019-11-18 21:05:39
    BP神经网络matlab代码,是.m文件,直接用matlab打开就能运行 BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络
  • BP(BackPropagation)神经网络是1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈...BP神经网络模型拓扑结构包括输入层(input)、隐层(hiddenlayer)和输出层(outputlayer)。
  • 两层隐含层BP神经网络,梯度下降法,反向权值更新
  • 具有动量和任意数量输入单元、隐藏层和输出单元以及隐藏层中任意数量神经元的多层反向传播神经网络的模糊控制。 模糊推理系统被用作加速多层反向传播神经网络与 Momentum 的收敛的解决方案。 模糊控制器用于基于...
  • BP神经网络算法及Matlab实现

    千次阅读 2021-12-12 09:27:07
    简单快速入手BP神经网络算法

    数据结构与算法

    BP神经网络算法

    1. 算法原理

    1.1 概述

    人工神经网络无需事先确定输入输出之间映射关系的数学方程,仅通过自身的训练,学习某种规则,在给定输入值时得到最接近期望输出值的结果。作为一种智能信息处理系统,人工神经网络实现其功能的核心是算法。BP神经网络是一种按误差反向传播(简称误差反传)训练的多层前馈网络,其算法称为BP算法,它的基本思想是梯度下降法,利用梯度搜索技术,以期使网络的实际输出值和期望输出值的误差均方差为最小。
    BP神经网络的计算过程正向计算过程反向计算过程组成。正向传播过程,输入模式从输入层经隐单元层逐层处理,并转向输出层,每一层神经元的状态只影响下一层神经元的状态。如果在输出层不能得到期望的输出,则转入反向传播,将误差信号沿原来的连接通路返回,通过修改各神经元的权值,使得误差信号最小。

    1.2 算法分析

    多层神经网络结构

    通常一个多层神经网络由 L L L​​层神经元组成,第一层称作输入层,最后一层称作输出层,中间层为隐含层

    多层神经网络的基本组成元素是神经元,单个神经元的模型如下:

    image-20210803202615457

    输入层输入向量: X = ( x 1 , x 2 , . . . , x i , . . . , x m ) ; X=(x_1,x_2,...,x_i,...,x_m); X=(x1,x2,...xi,...,xm);

    l l l​​​​​层的隐含层向量: H l = ( h 1 l , h 2 l , . . . , h j l , . . . , h s l l ) ( l = 2 , 3 , . . . , L − 1 , j = 1 , 2 , . . . , s l ) ; H^l=(h_1^l,h_2^l,...,h_j^l,...,h_{s_l}^l) (l=2,3,...,L-1,j=1,2,...,s_l); Hl=(h1l,h2l,...,hjl,...,hsll)(l=2,3,...,L1,j=1,2,...,sl);​​​​

    输出层输出向量: Y = ( y 1 , y 2 , . . . , y k , . . . , y n ) ; Y=(y_1,y_2,...,y_k,...,y_n); Y=(y1,y2,...,yk,...,yn);

    w i j l w_{ij}^l wijl为从第 l − 1 l-1 l1层的第 i i i个神经元与第 l l l层的第 j j j​个神经元之间的连接权重, b j l b_j^l bjl为第 l l l层第 j j j​个神经元的偏置。

    因此得到:
    h j l = f ( n e t j l ) n e t j l = ∑ j = 1 s l − 1 w i j l + b j l h_j^l=f(net_j^l) \\ net_j^l=\sum_{j=1}^{s_{l-1}}{w_{ij}^l+b_j^l} hjl=f(netjl)netjl=j=1sl1wijl+bjl
    其中 n e t j l net_j^l netjl为第 l l l层第 j j j个神经元的输入, f ( ⋅ ) f(\cdot) f()​为激活函数。

    激活函数

    作用:引入非线性因素,使得模型能够较好地逼近非线性函数。

    BP神经网络算法常用的激活函数:

    • Sigmod函数:
      f ( x ) = 1 1 + e x f(x)=\frac{1}{1+e^x} f(x)=1+ex1
      image-20210804000024960

    • Tanh函数(双曲正切函数)
      f ( x ) = e x − e − x e x + e − x f(x)=\frac{e^x-e^{-x}}{e^x+e^{-x}} f(x)=ex+exexex

      image-20210804001057704

      偏置

      作用:可以理解为加入一个与输入 X X X无关的常数项,使得逼近的效果更好。

      img

      如果用 y = x y=x y=x​​​去逼近,效果不如人意,相反如果加入一个常数项,使得 y = x + 2 y=x+2 y=x+2​,效果则会好很多。

      img

      误差函数:

      作用:衡量输出结果与期望输出的差距

      假设有 p p p​个训练样本 { ( x ( 1 ) , y ( 1 ) ) , ( x ( 2 ) , y ( 2 ) ) , . . . , ( x ( p ) , y ( p ) ) } \{(x(1),y(1)),(x(2),y(2)),...,(x(p),y(p))\} {(x(1),y(1)),(x(2),y(2)),...,(x(p),y(p))}​, d ( i ) d(i) d(i)​为对应 x ( i ) x(i) x(i)​的期望输出,假设单个训练样本有 n n n​个输出。定义误差函数:
      E = 1 p ∑ i = 1 p E ( i ) E=\frac{1}{p}\sum_{i=1}^p{E(i)} E=p1i=1pE(i)
      其中 E ( i ) E(i) E(i)为单个样本的训练误差:
      E ( i ) = 1 2 ∑ k = 1 n ( d k ( i ) − y k ( i ) ) 2 E(i)=\frac{1}{2}\sum_{k=1}^n(d_k(i)-y_k(i))^2 E(i)=21k=1n(dk(i)yk(i))2
      因此全局误差函数:
      E = 1 2 p ∑ i = 1 p ∑ k = 1 n ( d k ( i ) − y k ( i ) ) 2 E=\frac{1}{2p}\sum_{i=1}^p\sum_{k=1}^n{(d_k(i)-y_k(i))^2} E=2p1i=1pk=1n(dk(i)yk(i))2

      如何更新权重与偏置

      误差反向传播更新权重与偏置

      一般采用梯度下降法更新权重与偏置:
      w i j l = w i j l − α ∂ E ∂ w i j l b j l = b j l − α ∂ E ∂ b j l w_{ij}^l=w_{ij}^l-\alpha \frac{\partial E}{\partial w_{ij}^l} \\ b_{j}^l=b_j^l-\alpha \frac{\partial E}{\partial b_j^l} wijl=wijlαwijlEbjl=bjlαbjlE

      其中 α \alpha α为学习速率, α ∈ ( 0 , 1 ) \alpha\in(0,1) α(0,1)​​。BP神经网络算法关键就在与如何求解上述两个偏导数,具体推导比较繁杂,这里就不在叙述,相关参考将附在文末2

    1.3 回顾

    最后我们再通过一个示意图,回顾BP神经网络算法的整个流程。

    image-20210804155659704
    1.4 优劣势

    优势

    主要用于以下四个方面:

    • 函数逼近
    • 模式识别
    • 分类
    • 数据压缩

    劣势

    • 学习速度慢,需要多次学习才能收敛
    • 采用梯度下降法,容易陷入局部最小值
    • 网络层数、神经元个数的选取没有理论指导,主要凭借经验
    • 网络推广能力有限

    2. Matlab实现

    2.1 算法实现步骤

    (1) 进行数据预处理

    (2) 建立BP神经网络模型

    (3) 利用样本进行训练

    (4) 返回训练结束的模型

    2.2 案例

    ​ 在建立BP神经网络模型以及训练(即更新权重与偏置)Matlab有自带的函数,在实现BP神经网络算法的时候,我们直接调用这些函数就可以。

    ​ 为了能够更清晰地了解算法的实现过程,这里选取比较简单的数据进行演示。

    案例一:曲线拟合

    题目:创建BP神经网络

    输入向量 P = [ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ] ; P=[0,1,2,3,4,5,6,7,8,9,10]; P=[0,1,2,3,4,5,6,7,8,9,10];

    期望输出 T = [ 0 , 1 , 2 , 3 , 4 , 3 , 2 , 1 , 2 , 3 , 4 ] ; T=[0,1,2,3,4,3,2,1,2,3,4]; T=[0,1,2,3,4,3,2,1,2,3,4];

    散点图如下:

    img

    试用BP神经网络算法对上图进行拟合,并将拟合效果绘图展示。

    Matlab代码

    close all; clearvars; clear; %清空工作环境
    P = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    T = [0, 1, 2, 3, 4, 3, 2, 1, 2, 3, 4];
    %由于feedforwardnet函数自动对样本进行归一化和划分训练、验证、测试集,
    %所以就不用手动将数据进行归一化处理,但不知道有没有打乱顺序
    % n=size(P,2); temp=randperm(n); P_train=P(temp(1:8));
    % T_train=T(temp(1:8)); P_test=P(temp(9:end)); T_test=T(temp(9:end));
    %
    % [p_train,p_input]=mapminmax(P_train,0,1);
    % [t_train,t_output]=mapminmax(T_train,0,1);
    % p_test=mapminmax(P_test,p_input);
    net = feedforwardnet(5, 'traingd'); 
    %是'5'是指隐含层有5个神经元,这里只有一个隐含层,多个隐含层神经元的个数设置为[5,3,...]
    
    net.trainParam.lr = 0.01; %学习速率
    net.trainParam.epochs = 10000; %最大训练次数
    net.trainParam.goal = 1e-6; %最小误差,达到该精度,停止训练
    net.trainParam.show = 50; %每50次展示训练结果
    net = train(net, P, T); %训练
    Y = net(P); %输出
    perf = perform(net, Y, T);%误差
    plot(P, T, P, Y, 'r-')
    
    

    结果还不错的几个图

    2
    3 4

    由于训练的样本太少,所以结果不是很令人满意。

    案例二:蠓虫分类

    题目:依据的资料是触角和翅膀的长度,已经测得了9 支Af 和6 支Apf 的数据如下:
    Af: (1.24,1.72),(1.36,1.74),(1.38,1.64),(1.38,1.82),(1.38,1.90),(1.40,1.70),
    (1.48,1.82),(1.54,1.82),(1.56,2.08).
    Apf: (1.14,1.78),(1.18,1.96),(1.20,1.86),(1.26,2.00),(1.28,2.00),(1.30,1.96).

    试对触角和翼长分别为(1.24,1.80),(1.28,1.84)与(1.40,2.04)的3 个标本加以识别。

    Matlab代码

    clearvars; close all; %清空工作环境
    %导入数据,第一列为触角长度,第二列为翅膀长度
    x_1 = [1.24, 1.72; 1.36, 1.74; 1.38, 1.64; 1.38, 1.82;
        1.38, 1.90; 1.40, 1.70; 1.48, 1.82; 1.54, 1.82; 1.56, 2.08]; %Af蠓虫
    x_2 = [1.14, 1.78; 1.18, 1.96; 1.20, 1.86; 1.26, 2.00; 1.28, 2.00;
        1.30, 1.96]; %Apf蠓虫
    x = [x_1; x_2]'; %合并转置,因为feedforwardnet函数以一列为单个样本
    
    goal = [ones(1, 9), zeros(1, 6); zeros(1, 9), ones(1, 6)]; %(1,0)表示为
    %Af蠓虫,(0,1)表示Apf蠓虫
    x_recognize = [1.24, 1.80; 1.28, 1.84; 1.40, 2.04]'; %识别的样本
    
    plot(x_1(:, 1), x_1(:, 2), 'ro', 'DisplayName', 'Af'); %绘制Af的散点图
    hold on;
    plot(x_2(:, 1), x_2(:, 2), 'bo', 'DisplayName', 'Apf'); %绘制Apf的散点图
    plot(x_recognize(1, :), x_recognize(2, :), 'yo', 'DisplayName', '识别' ); %绘制识别样本的散点图
    xlabel('触角长度');
    ylabel('翅膀长度');
    legend;
    
    net = feedforwardnet([3, 2], 'trainlm'); %两层隐含层,相应神经元个数分别为3和2,采用L-M优化算法,效果比较好
    net.trainParam.max_fail = 1000; %连续1000次误差不下降,停止训练
    net.trainParam.lr = 0.05; %学习速率
    net.trainParam.epochs = 10000; %最大训练次数
    net.trainParam.goal = 1e-15; %最小误差,达到该精度,停止训练
    net.trainParam.show = 50; %每50次展示训练结果
    net = train(net, x, goal); %训练
    y0 = sim(net, x) %输出
    perf = perform(net, goal, y0)%误差
    ym = sim(net, x_recognize) %识别
    
    

    下图是蠓虫的散点图,可以看出这三个样本还是比较难分类的,肉眼几乎很难判断。利用BP神经网络算法得到的结果有时候也会有比较大的差异,这也很正常,仅通过触角和翅膀长度确实不易分辨。

    这是训练误差比较低情况下的一个输出,显示识别样本中第一、第二为Af类型的蠓虫,第三为Apf类型的蠓虫。

    image-20210804215106236

    3. 参考来源

    [1] BP神经网络_百度百科 (baidu.com)

    [2] BP神经网络推导过程详解 - Alex Yu - 博客园 (cnblogs.com)

    [3] 专题 通过四个matlab建模案例彻底精通BP神经网络_哔哩哔哩_bilibili

    [4] 最容易听懂的BP神经网络教程----萌新入门首选课_哔哩哔哩_bilibili

    展开全文
  • BP算法是由学习过程由信号的正向传播与误差的反向传播两个过程组成。由于多层前馈网络的训练经常采用误差反向传播算法,人们也常把将多层前馈网络直接称为BP网络
  • 大家好,我最近刚发完论文可以稍稍放松一段时间,之前就发现越来越多的人在学习神经网络的知识,而且有些同学对其也是十分推崇。其实也不奇怪,哈哈,结合当今地时代背景,不管是在什么领域,大家都希望我们身边地...

    简介

    大家好,我最近刚发完论文可以稍稍放松一段时间,之前就发现越来越多的人在学习神经网络的知识,而且有些同学对其也是十分推崇。其实也不奇怪,哈哈,结合当今地时代背景,不管是在什么领域,大家都希望我们身边地东西变得越来越智能,比如手机,电脑等,甚至像像华为公司开发地鸿蒙系统,把日常地电器和手机连接在一起,从而向用户提供更智能地服务。
    在这里插入图片描述
    (给文章加点图,要不然都是文字太难看了,侵权删)
    但是如何才能让我们的生活更加智能呢?答案可能是让机器可以向人类一样进行思考,神经网络作为模仿人类大脑神经元的一种算法恰好可以提供这样的服务。本文仅对基本的Bp神经网络进行介绍,主要推导在BP神经网络反向传播的过程中参数如何调整,并且用matlab简单的模拟了一些BP神经网络的训练过程。
    PS:简单介绍一下鸿蒙系统,目前手机主流的操作系统有鸿蒙,安卓以及苹果的系统,鸿蒙系统与他们的本质区别在于鸿蒙系统是面向5g的,有种希望实现万物互联的感觉,从5g的角度去看,鸿蒙确实有着跨时代的意义。

    BP神经网络

    BP神经网络的结构和过程其实很简单,其结构可以大致分为三部分:(1)输入层,输入数据;(2)隐藏层,处理数据;(3)输出层,输出结果。其过程可以分为正向传播过程和反向传播过程,在正向传播过程中,BP神经网络通过隐层神经元对数据进行处理,从而输出相应结果,在反向传播过程中BP神经网络通过对比真实结果与预测结果之间的误差E来不断调整各层神经元的参数值,从而减小误差,达到理想的效果。调整的原则是是误差不断减小,因此应使权值调整量与误差梯度下降成正比。

    大家可以看一下下面的误差公式:

    在这里插入图片描述
    其中E代表误差,d_{k}代表输出层第k个神经元的真实值,后面的f为神经网络的激活函数,此公式代表单隐层的BP神经网络的误差,w_{jk}和v_{ij}为输入层和隐层,以及隐层和输出层之前的权值。

    神经网络的权值调整量的求解如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述
    (中间过程实在懒得写了)
    不过大家可以看出来,随着隐层的不断增多,需要求的在这里插入图片描述
    类似这样的参数就越多,如何求出这种参数也是自己实现BP神经网络的关键,参考上面的过程,大家可以看出需要牵扯到符合函数求导的过程,单隐层很简单,单随着隐层数量不断增多,复合函数求导过程也就越复杂,对于多层复合函数需通过链式法则进行求解,但由于过程还是很抽象,大家可以先求解sin(sin2x)这样类推。

    BP神经网络流程图

    下面的流程图参考当时的教材,BP神经网络其实也分为两种,其区别在于对误差的调整,一种是每输入一个样本就计算相应误差对全职进行调整,也叫标准BP神经网络;二,则是计算所有样本的总误差,也称为屁训练BP神经网络,流程图如下所示:

    在这里插入图片描述

    我实现的是标准BP神经网络,代码如下:

    input=[1,2,3;4,5,6;7,8,9];
    output=[1,2;2,3;3,4];
    num=[3,3,3,2];
    layer=2;
    error=0.1;
    iter_time=100;
    rate=0.1;
    %不通过现有的matlab函数包实现BP神经网络功能
    a1=size(input);%输入向量的维度,input的列的维度等于输入节点的个数,input行的维度等于输入数据的数量
    a2=size(output);%输出向量的维度,output的列的维度等于输出节点的个数,output行的维度等于输出数据的数量
    %初始化权重参数
    parameters=cell(1,layer+1);
    %layer为隐层的数目
    for i=1:layer+1
        if i==1
            parameters{i}=rand(a1(2),num(i));
        elseif i==layer+1
            parameters{i}=rand(num(i-1),a2(2));
        else
            parameters{i}=rand(num(i),num(i));
        end
    end
    %定义神经元的阈值
    T=cell(1,layer+2);
    for i=1:layer+2
       T{i}=ones(1,num(i));%num隐层节点个数
    end
    i=1;
    Error=zeros(1,a1(1));
    while i<=iter_time
        result=cell(1,layer+1);
    %正向传播过程
        for j=1:a1(1)
            for k=1:layer+1
                if k==1
                        result{k}=ones(1,num(k+1))./[1+exp(input(j,:)*parameters{k}-T{k}*parameters{k})];
                else
                        result{k}=ones(1,num(k+1))./[1+exp(result{k-1}*parameters{k}-T{k}*parameters{k})];
                end
            end
            %计算第j个样本误差
            s=0;
            for t=1:a2(2)
                s=s+(output(j,t)-result{layer}(t));
            end
            Error(j)=s^(0.5);
            %反向传播过程
            delta=cell(1,layer+1);%计算反向传播过程中可能需要的参数
            for t=1:a2(2)
                delta{layer+1}(t)=(output(j,t)-result{layer+1}(t))*result{layer+1}(t)*(1-result{layer+1}(t));
            end
            for t=layer:-1:1
                middle=ones(1,num(t));
                for r=1:num(t)
                    for l=1:num(t+2)
                        middle(1,r)=middle(1,r)+delta{t+1}(l)*parameters{t}(r,l);
                    end
                    delta{t}(r)=middle(r)*result{t}(r)*(1-result{t}(r));
                end
            end
            %调节参数
            for t=1:layer+1
                for r=1:num(t)
                    for l=1:num(t+1)
                        parameters{t}(r,l)=parameters{t}(r,l)+rate*delta{t}(l)*result{t}(l);
                    end
                end
            end
        %检查误差是否符合要求
        E_MSE=(sum(Error.^(2))/a1(1))^(0.5);
        if E_MSE<error
            break;
        end
        end
    R=result{layer+1};
    i=i+1;
    end
    

    这个并不能代表完整的BP神经网络算法过程,仅仅是实现了他模拟调整参数的过程,完整的过程还需要对神经网络进行训练,记录其训练好的参数,这样当有了新的输入才能给出准确的输出。

    结语

    BP神经网络的实现非常简单,但是利用人家·做好的函数可能并不能真正的理解他的原理和过程,虽然这只是重复他人的工作,但我觉得可以加深自己对神经网络的理解。就这样,哈哈哈 有错误或者其他问题欢迎交流。

    展开全文
  • 是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络
  • BP神经网络Matlab程序

    2019-03-01 10:44:42
    BP(back propagation)神经网络是1986年由Rumelhart和McClelland为首的科学家提出的概念,是一种按照误差逆向传播算法训练的多层前馈神经网络,是目前应用最广泛的神经网络
  • BP神经网络通俗教程(matlab实现方法)

    万次阅读 多人点赞 2020-09-05 21:38:19
    BP神经网络通俗教程(matlab实现方法) 黑色字体可看可不看,是帮助理解所用 红色字体是比较重要的部分,必看 BP神经网络是什么 BP(Back-propagation,反向传播)神经网络是最传统的神经网络。当下的各种神经网络的...

    BP神经网络通俗教程(matlab实现方法)

    BP神经网络是什么

    BP(Back-propagation,反向传播)神经网络是最传统的神经网络。当下的各种神经网络的模型都可以看做是BP神经网络的变种(虽然变动很大…)。
    这东西是干什么用的呢?
    我们在现实中要处理的一切问题映射到数学上只分为两类,可归纳的问题不可归纳的问题。首先什么是不可归纳的问题,举个例子,你不能用一套完美的数学公式去表达所有的质数 , 因为目前的研究表明,还没有什么方法是能够表达质数的,也就是说,质数的出现,本身不具备严格的数学规律,所以无法归纳。
    但是我们人眼看到猫猫狗狗的图片就很容易分辨哪个是猫,哪个是狗。这说明在猫和狗之间,确实存在着不同,虽然你很难说清楚它们的不同到底是什么,但是可以知道,这背后是可以通过一套数学表达来完成的,只是很复杂而已。
    大部分AI技术的目的就是通过拟合这个复杂的数学表达,建立一个解决客观问题的数学函数。BP神经网络的作用也是如此。
    BP神经网络这个名字由两部分组成,BP(反向传播)和神经网络神经网络是说这种算法是模拟大脑神经元的工作机理,并有多层神经元构成的网络。
    而这个名字的精髓在BP上,即反向传播。反向传播是什么意思呢。这里举个例子来说明。
    比如你的朋友买了一双鞋,让你猜价格。
    你第一次猜99块钱,他说猜低了。
    你第二次猜101块钱,他说猜高了。
    你第三次猜100块钱,他说猜对了。
    你猜价格的这个过程是利用随机的数据给出一个预测值,这是一个正向传播
    而你的朋友将你的预测值与真实值进行对比,然后给出一个评价,这个过程是一个反向传播
    神经网络也是类似的过程,通过对网络的超参数进行随机配置,得到一个预测值。这是一个正向传播的过程。而后计算出预测值与真实值的差距,根据这个差距相应的调整参数,这是一个反向传播的过程。通过多次迭代,循环往复,我们就能计算出一组合适的参数,得到的网络模型就能拟合一个我们未知的复杂函数。
    我们来看这个BP神经网络的示意图

    其中蓝色的箭头是正向传播的过程,黄色的线条就是反向传播。

    BP 神经网络的具体描述

    BP神经网络的拓扑结构

    在这里插入图片描述
    上面这张图是BP神经网络的拓扑结构。简而言之就是分为三个“层”。输入层、隐藏层和输出层(一般情况下隐藏层会有若干层,这里只画了一个隐藏层)。每个层都包含若干个神经元(图中圆形)。上一层的输出作为下一层输入(数据的联系如图中连线所示)

    单个神经元

    在这里插入图片描述
    单个的神经元如上图所示。 x i x_i xi为输入, w i w_i wi代表权重, θ i θ_i θi代表阈值。 y k y_k yk代表输出。这里还有一个偏置 b b b和激活函数 f ( x ) f(x) fx没有画出。总之,一个神经元需要四个参数和一个函数才能得到输出(输入、权重、阈值、偏置还有激活函数)

    具体数学表达为:
    n e t i = ∑ i = 0 n x i w i = x 1 w 1 + x 2 w 2 . . . net_i=\sum_{i=0}^n x_iw_i=x_1w_1+x_2w_2... neti=i=0nxiwi=x1w1+x2w2...
    如果这个 n e t i net_i neti大于 θ i θ_i θi,那么这个神经元被激活,继续运算
    反之这个神经元关闭,没有输出
    激活后做如下运算:
    y k = f ( n e t i + b ) y_k=f(net_i+b) yk=fneti+b
    这样就求得了这个神经元的输出。

    激活函数 f ( x ) f(x) fx

    在单个神经元中的 f ( x ) f(x) fx是激活函数。下图是三种常用的激活函数。
    在这里插入图片描述
    为什么要使用激活函数呢?
    激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
    如果没有激活函数,无论网络有多少层,输出都只能是输入的线性组合,这样就形成了原始的感知机。

    反向传播

    反向传播是这个算法的精髓!上文已经形象的说明了反向传播的大致原理。下面我们来看反向传播具体是怎么运行的。
    就像猜价格游戏一样,通过不断调整你猜的价格,使得预测的价格接近真实的价格。
    我们希望通过调整权重 w w w,使得预测值 o o o与真实值 t t t的差距缩小。
    那么首先我们需要先定义预测值 o o o与真实值 t t t的差距,我们用损失函数(loss function)来衡量。
    下面列出了几种常用的损失函数:
    在这里插入图片描述
    左边是解决分类问题时常用的损失函数,右边是解决回归问题时常用的损失函数。具体函数的公式我就不写了,你们具体要用的时候直接按照名字百度一下就好。
    这边只提一下均方误差损失函数(MSE),因为下文要以他为例子: E = 1 / 2 ( o − t ) 2 E=1/2(o-t)^2 E=1/2(ot)2
    其中 E E E代表ERORR值,也叫LOSS值。是衡量误差的指标。
    再说一遍,我们的目的就是通过调整权重 w w w E E E尽可能的小。所以我们建立权重 w w w E E E的函数,把权重 w w w看作自变量,把 E E E看作因变量。求出导数。利用梯度下降的原理使 E E E沿着越来越小的方向下降。
    推导过程:
    在这里插入图片描述
    这里的误差函数就是均方误差(MSE),梯度下降的公式中 η η η代表学习率,是人为设定的一个参数。 Δ w j i Δw_{ji} Δwji我们要调整权重的改变值。
    输出层求解步骤如下,注意理解Step2是对LOSS函数求偏导,Step3是对激活函数求偏导。
    在这里插入图片描述
    结果带入梯度下降公式可得:
    在这里插入图片描述
    隐藏层求解步骤:

    在这里插入图片描述带入梯度下降公式可得:
    在这里插入图片描述

    根据求得的结果相应的调整权重 w w w就完成了一次反向传播。
    然后开始下一次迭代,循环往复,直至达到收敛条件,跳出循环。

    BP神经网络的基本运行原理就介绍完了。

    神经网络的Matlab实现

    Matlab自带神经网络的工具包,所以实现的这个环节还是非常简单的。我以Matlab2020为例演示一下。(示例数据和题目来自“清风数学建模”)
    例题如下:
    在这里插入图片描述给出的数据保存在一个EXCEL文档中。截图了一小部分:
    在这里插入图片描述

    首先我先将数据导入到Matlab的变量中,X代表训练集和验证集的吸光度数据,Y代表训练集和验证集的辛烷值。new_X代表测试集
    在这里插入图片描述打开APP选项卡中的Neural Net Fitting
    在这里插入图片描述

    弹出如下对话框,这个主要是模型的简介,:
    在这里插入图片描述
    直接点NEXT得到下面对话框。Input选择输入值,Targets选择目标值。注意我们的数据是按行排列的,Samples选择Matrix rows。然后Next。
    在这里插入图片描述
    这个是训练集、验证集和测试集的比例,一般默认就好。Next。

    在这里插入图片描述
    下面设定隐藏层的层数,我选择默认,10层。Next。
    在这里插入图片描述
    在下图的那个下拉框中选择算法。具体算法的区别可以百度一下。第二种是效果最好的,能有效减少过拟合现象,但收敛速度极慢。1、3两种算法不够准确,但很快。点击Train开始训练你的模型。
    在这里插入图片描述弹出如下对话框:
    在这里插入图片描述点击Performance查看误差曲线,误差当然是越小越好。
    在这里插入图片描述
    点Fit查看三个集的回归图,R越接近1越好。
    在这里插入图片描述回到下面这个页面,直接Next两次。
    在这里插入图片描述
    matlab Function是生成模型的matlab代码
    Neural Network Diagram是模型示意图,放在论文里比较好看。Next。
    在这里插入图片描述点Save Results,然后Finsh。
    在这里插入图片描述

    模型就训练好了,下面可以做预测了,执行下面代码:

    % 这里要注意,我们要将指标变为列向量,然后再用sim函数预测
    sim(net, new_X(1,:)')
    
    % 写一个循环,预测接下来的十个样本的辛烷值
    predict_y = zeros(10,1); % 初始化predict_y
    for i = 1: 10
        result = sim(net, new_X(i,:)');
        predict_y(i) = result;
    end
    disp('预测值为:')
    disp(predict_y)
    

    得到预测结果:
    在这里插入图片描述
    到这里,实现过程就成功了。

    小伙伴,码字很辛苦的,如果你看懂了,请给我一个赞吧!

    展开全文
  • 多层前馈神经网络bp(back propagation)代码附带数据集,matlab版本
  • MATLAB计算多层隐含层BP神经网络

    千次阅读 2020-12-22 14:50:57
    9层隐含层BP神经网络MATLAB程序(旅游环境容量的预测,由过去数据预测未来年份环境容量),在下面T=[?](T,输出量,)中,因该怎样选择T内的值?P(输入量,)因该如何选取?运行结果见程序下面。close allclearecho ...
  • 本算法已经整理成文档如下,有需要的朋友可以点击进行下载由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量...
  • BP神经网络进行数据分类,是一种多层前馈神经网络,该网络的主要特点是信号前向传递,误差反向传播。运用梯度下降法,
  • BP神经网络是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的 输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速...
  • BP神经网络Matlab实现)

    千次阅读 2020-09-02 10:25:51
    BP神经网络是反向传播网络(back propagation)的简称,它是一种多层前向网络,采用最小均方误差学习方式。 算法步骤: 代码如下: function example9_1() p = [1.78 1.96 1.86 1.72 2.00 2.00 1.96 1.74 1.64 1.82...
  • BP神经网络matlab库实现 先把代码存在这里,以后用了方便 原理 BP神经网络是一种多层的前馈神经网络,其主要的特点是:信号是前向传播的,而误差是反向传播的。具体来说,对于如下的只含一个隐层的神经网络模型...
  • %创建一个新的前向神经网络net_1=newff(minmax(P),[10,1],{'tansig','purelin'},'traingdm')%当前输入层权值和阈值{1,1}inputbias=net_1.b{1}%当前网络层权值和阈值{2,1}layerbias=net_1.b{2}%设置训练参数=50;...
  • 深度学习 神经网络 BP 多层感知机 非线性函数 拟合 matlab
  • %画出预测结果误差图figureplot(error,'-*')title('BP网络预测误差','fontsize',12)ylabel('误差','fontsize',12)xlabel('样本','fontsize',12)。三、训练函数与学习函数的区别函数的输出是权值和阈值的增量,训练...
  • 资源链接 MATLAB实现智能计算方法课程所有实验...利用BP神经网络,解决性别分类问题: 原始数据student.xls,部分数据放入报告中即可; 以身高、体重为输入,性别为输出,设计网络结构(以图的形式放入报告); 手工编
  • % 隐藏层神经元的个数 %% Training Neural Network training_input=input_ANN([ff_zeros Rx_signal1],ff_TDL,tlen); % 训练输入 net = newff(minmax(training_input),[nneu 1],{'logsig','purelin'},'trainscg') ...
  • 使用软件为MATLAB2016a,有关用三层BP网络去逼近一个正弦函数的小程序,去不同的隐层节点数进行实验对比,内含实验结果,
  • 基于遗传算法GA优化的BP神经网络预测和分类(含优化前对比) 文章目录基于遗传算法GA优化的BP神经网络预测和分类(含优化前对比)1. BP神经网络预测原理简介2. 遗传算法GA优化BP神经网络原理3. GA-BP模型建立3.1 ...
  • 使用Matlab实现神经网络2.1 newff函数2.1.1 newff函数语法2.1.2 常用的激活函数2.1.3 常见的训练函数2.1.4 网络配置参数2.2 train函数2.3 sim函数3. 参数设置对神经网络性能的影响3.1 隐含层节点个数3.2 激活函数的...
  • 基于Matlab平台的BP神经网络进行数据拟合 上次讨论了基于Hopfield神经网络的数字识别,BP(Back Propagation)神经网络也可以进行相关的数字识别如手写数字识别等,由于BP神经网络的特性,该网络需要一定的样本进行...
  • BP神经网络做数据预测有两种形式:1.根据自身已有的数据预测未来的数据。比如:根据2000-2012年已知GDP的值预测2013年GDP的值。求解:用2000,2001,2002的值作为输入,2003作为输出;然后以此类推,2001,2002,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,386
精华内容 954
关键字:

多层bp神经网络matlab

友情链接: OPC-Client.zip