您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > AI人工智能 > BP神经网络(人工智能)
1/20西安邮电学院智能科学基础实验—BP神经网络学院名称:学生姓名专业名称:班级:实验时间:2/20课程设计题目:BP神经网络一、BP神经网络概述1.1BP神经网络定义:在人工神经网络发展历史中,很长一段时间里没有找到隐层的连接权值调整问题的有效算法。直到误差反向传播算法(BP算法)的提出,成功地解决了求解非线性连续函数的多层前馈神经网络权重调整问题。BP(BackPropagation)网络是误差反向传播神经网络的简称,1986年由Rumelhart和McCelland为首的科学家小组提出,是一种按误差逆传播算法训练的多层前馈网络,是目前应用最广泛的神经网络模型之一。BP网络能学习和存贮大量的输入-输出模式映射关系,而无需事前揭示描述这种映射关系的数学方程。它的学习规则是使用最速下降法,通过反向传播来不断调整网络的权值和阈值,使网络的误差平方和最小。BP神经网络模型拓扑结构包括输入层(input)、隐层(hidelayer)和输出层(outputlayer)。又根据网络结构的不同和学习算法的区别,人工神经网络可以分为很多种不同的类型,其中后向传播学习的前馈型神经网络(BackPropsgstionFeed-forwardNeuralNetwork,BPNN)应用最为广泛。1.2BP神经网络算法的基本思想:BP(BackPropagation)神经网络,即误差反传误差反向传播算法的学习过程,由信息的正向传播和误差的反向传播两个过程组成。输入层各神经元负责接收来自外界的输入信息,并传递给中间层各神经元;中间层是内部信息处理层,负责信息变换,根3/20据信息变化能力的需求,中间层可以设计为单隐层或者多隐层结构;最后一个隐层传递到输出层各神经元的信息,经进一步处理后,完成一次学习的正向传播处理过程,由输出层向外界输出信息处理结果。当实际输出与期望输出不符时,进入误差的反向传播阶段。误差通过输出层,按误差梯度下降的方式修正各层权值,向隐层、输入层逐层反传。周而复始的信息正向传播和误差反向传播过程,是各层权值不断调整的过程,也是神经网络学习训练的过程,此过程一直进行到网络输出的误差减少到可以接受的程度,或者预先设定的学习次数为止。1.3BP神经网络基本原理:输入信号Xi通过中间节点(隐层点)作用于输出节点,经过非线形变换,产生输出信号Yk,网络训练的每个样本包括输入向量X和期望输出量t,网络输出值Y与期望输出值t之间的偏差,通过调整输入节点与隐层节点的联接强度取值Wij和隐层节点与输出节点之间的联接强度Tjk以及阈值,使误差沿梯度方向下降,经过反复学习训练,确定与最小误差相对应的网络参数(权值和阈值),训练即告停止。此时经过训练的神经网络即能对类似样本的输入信息,自行处理输出误差最小的经过非线形转换的信息。1.4BP神经网络基本模型:BP网络模型包括其输入输出模型、作用函数模型、误差计算模型和自学习模型。4/20二、算法及流程2.1BPNN概述:BPNN是一种典型的神经网络,广泛应用于各种分类系统,它也包括了训练和使用两个阶段。由于训练阶段是BPNN能够使用的基础和前提,而使用阶段本身就是一个非常简单的过程,也就是给输入,BPNN会根据已经训练好的参数进行计算,得到输出结果,因此这里只针对BPNN的训练阶段说明神经网络的学习过程。BPNN中的前馈型网络结构是指在处理样本的时候,从输入层输入,向前把结果输出到第一隐含层,然后第一隐含层将接收的数据处理后作为输出,该输出作为第二隐含层的输入,以此类推,直到输出层的输出为止;反向传播是指通过比较输出层的实际输出和预期的结果,得到误差,然后通过相关的误差方程式调整最后一个隐含层到输出层之间的网络权重,之后从最后一个隐含层向倒数第二隐含层进行误差反馈,调整他们之间的网络权重,以此类推,直到输入层与第一隐含层之间的网络权重调整为止。5/202.2BPNN训练过程的流程图及伪代码:图为BP神经网络算法训练阶段的流程图和伪代码2.3BP神经网络算法的具体步骤:步骤1:初始化网络权重否否是是开始初始化:对网络权值和神经元偏置进行随机赋值,选取第一个输入样本迭代次数t=1前向求出各个隐含层和输出层的输出求输出层与预期输出的偏差E反向传播误差,求所有隐含层的误差调整权值和神经元偏置本样本训练结束?迭代次数t=t+1所有样本训练完毕?选择下一个训练样本结束//功能:BP神经网络训练过程的伪代码procedureBPNNInitialization,includetheandforeachsampleXwhilenotstop//forwardspropagationoftheinputforeachunitjinthehiddenandoutputlayer//calculatetheerror;=foreachunitjintheoutputlayer//calculatetheerrorE//backpropagationoftheerrorforeachunitjinthehiddenlayer//calculatetheerror;=(1-)//adjustthenetworkparametersforeachnetworkweight=+(l);foreachbiasedθj;endofwhilenotstopendofforeachsampleXendofprocedure6/20每个神经元之间的网络连接权重被初始化为一个很小的随机数(-1.0—1.0或者-0.5—0.5根据问题本身而定),同时每个神经元有一个偏置,也被初始化为一个随机数。对每个输入样本x,按步骤2进行处理。步骤2:向前传播输入(前馈型网络)首先,根据训练样本x提供的网络输入层,通过计算得到每个神经元的输出。每个神经元的计算方法相同,都是由其输入的线性组合得到,具体的计算公式为:=其中,是由上一层的单元i到本身单元j的网络权重;是上一层的单元i的输出;为本单元的偏置,用来充当阈值,可以改变单元的活性。从上面的公式可以看到,神经元j的输出取决于其总输入=+然后通过激活函数=得到最终输出,这个激活函数称为logistic函数或者sigmoid函数,能够将较大的输入值映射为区间0—1之间的一个值,由于该函数是非线性的和可微的,因此也是得BP神经网络算法可以对线性不可分的分类问题进行建模,大大拓展了其应用范围。步骤3:反向误差传播由步骤2一路向前,最终在输出层得到实际输出,可以通过与预期输出相比较得到每个输出单元j的误差,如公式7/20所示,其中是输出单元j的预期输出。得到的误差需要从后向前传播,前面一层单元j的误差可以通过和它连接的后面一层的所有单元k的误差计算公式所得,具体的公式为:=(1-)依次得到最后yield隐含层到第一隐含层每个神经元的误差。步骤4:网络权重与神经元偏置调整在处理过程中我们可以一遍后向传播误差一边调整网络权重和神经元的阈值,但是为了方便起见,先计算得到所有神经元的误差,然后统一调整网络权重和神经元的阈值。调整权重的方法是从输出层与第一隐含层的连接权重开始,一次向后进行,每个连接权重根据下列公式进行调整。=(l)神经元偏置的调整方法是对每个神经元j进行如下列公式所示进行更新。=+=+(l)其中l是学习率通常取0—1之间的常数。该参数会影响算法的性能,太小的学习率会导致学习进行得慢,而太大的学习率可能会使算法出现在不适当的解之间震动的情况,一个经验规则是将学习率设为迭代次数t的倒数即为。步骤5:判断结束8/20对于每个样本,如果最终的输出误差小于可接受的范围或者迭代次数t达到了一定的阈值,则选取下一个样本,转到步骤2重新继续执行;否则迭代次数t加1,然后转向步骤2继续使用当前样本进行训练。三、课程设计的主要内容用三层BP神经网络实现对x1={1,0,1}分类为1,x2={0,1,0}分类为0的功能。3.1前馈型神经网络:(以x1={1,0,1}分类为1为例)随机给定网络连接权重和神经元偏置如下表:根据样本的输入计算每个单元的输出,然后计算每个单元的误差并后向传播,最后根据误差对网络连接权重和神经元偏置进行更新调整。每个神经元的总输入和输出计算表:0.2-0.30.40.1-0.50.2-0.3-0.2-0.40.20.1神经元j总输入=+输出=1234569/20每个神经元的误差计算表:神经元j误差60.474(1-0.474)(1-0.474)=0.131150.525(1-0.525)0.1311(-0.2)=-0.006540.332(1-0.332)0.1311(-0.3)=-0.0087网络连接权重和神经元偏置更新计算表:神经元j调整后的更新值-0.3+0.90.13110.332=-0.261-0.2+0.90.1311=-0.1380.2+0.9(-0.0087)1=0.192-0.3+0.91=-0.3060.4+0.9(-0.0087)0=0.40.1+0.9(-0.0065)0=0.1-0.5+0.9=-0.5080.2+0.90.1+0.90.2+0.9-0.4+0.93.2相应的代码及实现结果:40.2+0-0.5-0.4=-0.70.3325-0.3+0+0.2+0.2=0.10.5256-0.30.332-0.20.525+0.1=-0.1050.47410/20a.代码:#includestdlib.h#includemath.h#includestdio.h#defineOUT_COUT1//输出向量维数#defineIN_COUT3//输入向量维数#defineCOUT1//样本数量inti,j;staticdoublev[6][7];staticdoublew[7][7];staticdoublee[7]={1,1,1,1,1,1,1};//误差typedefstruct{//bp人工神经网络结构doubles1[42];doubles2[49];doublea;//学习率doubleb;intLoopCout;//最大循环次数}bp_nn;doublefnet(doublenet)//输出函数{return1/(1+exp(-net));}doubles10[42]={0,0,0,0,0,0,0,0,0,0,0,-1,-0.9,0,0,0,0,0,0.8,-1,0,0,0,0,0,-0.8,1,0,0,0,0,0,0,0,-0.8,0,0,0,0,0,0,-0.9};//初始化的参数doubles20[49]={0,0,0,0,-0.8,1,0.8};intInitBp(bp_nn*bp)//初始化bp网络{for(i=0;i42;i++)bp-s1[i]=s10[i];for(i=0;i49;i++)bp-s2[i]=s20[i];for(i=0;i6;i++)for(j=0;j7;j++)v[i][j]=bp-s1[7*i+j];for(j=0;j7;j++)w[0][j]=bp-s2[0*i+j];printf(请输入学习率:\n);11/20scanf(%lf,&(*bp).a);//(*bp).a为double型数据,所以必须是lfprintf(请输入误差精度:\n);scanf(%lf,&(*bp).b);//(*bp).b为double型数据,所以必须是lfprintf(请输入最大循环次数:\n);scanf(%d,&(*bp).LoopCout);return1;}doubleTrainBp(bp_nn*bp,floatx[COUT][IN_COUT],doubley[COUT])//训练bp网络,样本为x,理想输出为y{doublea=(*bp).a;//学习率doubleO1[7];//所有节点输出doubles[3];//最大循环次数intLoopCout=(*bp).LoopCout;//最大循环次数inti,j,n;for(n=0;e[6]!=0&&nLoopCout;n++){e[6]=0;for(i
本文标题:BP神经网络(人工智能)
链接地址:https://www.777doc.com/doc-2312411 .html