BP网络 程序

  • 格式:doc
  • 大小:101.00 KB
  • 文档页数:15

BP 网络的学习算法后传播网络的学习方式通常采用有指导的学习方式,网络可以将应有的输出与实际输出数据进行比较,其学习规则采用梯度下降规则,改变处理单元间的连接权重来减小实际出与应有输出间的误差,并在学习的过程中保持误差曲线的梯度下降。

网络训练过程即是网络中各权值不断调整的过程,这一过程分两步进行:第一步,输入信息前向传播,计算输出结果;第二步,误差信息反向传播,调整各权值,直至达到满意的结果。

具体步骤如下: 第一步:前向计算误差(1)、将输入变量进行归一化处理,转换为0~1内的数,传送到神经网络输入层节点。

(2)、中间层计算①.计算输入层各节点对中间层各节点的权重和:k i ij i k j gx W net 122,∑=②.计算中间层各节点的输出:kj net k j k j e net f gx 211)2(2-+==(3)、输出层计算:①.计算中间层各节点对输出层节点的权重和:k j jj k gx W net 233∑=②.计算输出层节点的输出值:k net k k e net f gx 311)3(3-+==(4)、误差计算:将输出变量(汽油干点实际化验值)进行归一化处理,转换为0~1内的数值,比较神经网络实际的输出值与应有的输出值便可得出误差:k k k gx gx E 3033-=其中:gx1为输入层节点的输出W2为输入层各节点对中间层各节点的连结权值net2为输入层各节点对中间层各节点的权重和gx2为中间层节点的输出W3为中间层节点到输出层节点的连结权值E3输出层节点的输误差gx3输出层节点的输出计算值gx30输出层节点的输出期望值net3中间层各节点对输出层节点的权重和下标:i----输入层第i 个节点j---中间层第j 个节点上标:k---第k 个样本第二步:误差向后传播,修改各层权值(1)、计算输出层误差平方和2)303(21k kk gx gx E -*=∑ 修改中间层节点到输出层节点的权重[])(3)(3)1(3)2()3(1)3(3)(3)1(3t W t W t W net f net f net f E t W t W j j j k j k k k k j j ∆+=+-+∆=+∆∑βα(2)、输入层节点到中间层节点的连接权重的修改 [][])(2)(2)1(2)2(1)2(1)(2)1(23)3(1)3(3,,,,,t W t W t W net f net f gx t W t W W net f net f E j i j i j i k k j k j k k i j i j i jk k k k ∆+=+-+∆=+∆-=∑∑δβαδ其中:β——学习速率α——动量因子参考程序,主要关注红色字体部分:Public Sub anns01_2() ' ANNS 网络模型二---批的规模为全部数据组 子程序Dim n01 As Integer ' 训练用数据库记录总数Dim n02 As Integer ' 检验用数据库记录总数Dim nn As Integer ' 中间层节点数Const nnn = 171 ' 数据库记录总数, 在此定义是为了避免过多地声明动态数组而影响运行速度Dim gx2(10) As Double ' 隐节点4个Dim gx20(10) As DoubleDim gx3 As Double ' 输出节点1个Dim gx30 As DoubleDim gx21(10, nnn) As DoubleDim gx22(10, nnn) As DoubleDim gx31(nnn) As DoubleDim gx32(nnn) As DoubleDim gxx1(tt, nnn) As DoubleDim gd1 As Double ' 实际输出值Dim aW1(tt, 10) As Double ' 增量形式Dim aW2(10) As Double ' 增量形式Dim aW10(tt, 10) As DoubleDim aW20(10) As DoubleDim k1 As Integer ' 计数器Dim k2 As IntegerDim i As LongDim ii As Integer 'Dim ii1 As Integer 'Dim aE34(nnn) As Double ' 各个记录的最终误差(用于调权、送训练数据库)Dim aE340(nnn) As Double ' 各个记录的最终误差(用于送检验数据库)Dim E0(nnn) As Double ' 误差的平方(用于保存上一步的数值)Dim aE3 As Double ' 训练绝对值平均误差Dim aE2 As Double ' 检验绝对平均误差Dim E As Double ' 误差的平方和(目标函数)Dim E1 As Double ' 训练均方差Dim E2 As Double ' 检验均方差Dim EE As Double ' 检验误差平方和Dim EE1 As Double ' 寻找最小值(当前最小)Dim EE2 As Double ' 前一次最小Dim gdjs(nnn) As Double ' 各个记录的计算值(用于送训练数据库)' Dim gds As Double ' 训练时保存干点值以求平均' Dim gdy As Double ' 检验时保存干点值以求平均Dim gdjy(nnn) As Double ' 检验数据库记录的干点计算值(用于送检验数据库)Dim aM1(tt, 10) As Double ' 权值调节量Dim aM2(10) As DoubleDim aE0 As Double ' 误差限Dim bb As Double ' 学习速率Dim bb0 As Double ' 学习速率系数Dim aa As Double ' 动量因子Dim aa0 As Double ' 动量因子Dim xx As Double ' 过渡变量Dim DouDl0 As Double ' 外加动量(数字形式)Dim intResult As IntegerDim sjk01 As DatabaseDim sjl01 As Recordset' 数据库1操作Set sjk01 = OpenDatabase("d:\My Programs\chen\chen01.mdb") ' 打开数据库Set sjl01 = sjk01.OpenRecordset("原始数据输入表_1", dbOpenDynaset) ' 打开表With sjk01.OpenRecordset("原始数据输入表_1", dbOpenDynaset)If .EOF = True And .BOF = True ThenintResult = MsgBox("没有数据用以训练!" + Chr(13) + Chr(13) + Chr(10) + _"输入数据吗?", vbApplicationModal + vbDefaultButton1 + vbQuestion _+ vbYesNo, "无数据提示:")Select Case intResultCase vbYesMsgBox "输入数据,请按输入数据按扭。

", vbApplicationModal + _vbInformation, "输入数据提示:"Exit SubCase vbNoMsgBox "很抱歉!没有数据,无法训练!", vbApplicationModal + vbInformation, _ "无数据提示:"Exit SubEnd SelectEnd If.MoveFirst.MoveLastn01 = .RecordCount ' 确定记录总数' n01 = 1 ' 20End With输入数据表.Data1.Recordset.MoveFirst' 数据库2操作Dim sjk02 As DatabaseDim sjl02 As RecordsetSet sjk02 = OpenDatabase("d:\My Programs\chen\chen02.mdb") ' 打开数据库Set sjl02 = sjk02.OpenRecordset("网络检验数据表", dbOpenDynaset) ' 打开表With sjk02.OpenRecordset("网络检验数据表", dbOpenDynaset)If .EOF = True And .BOF = True ThenintResult = MsgBox("没有数据用以检验!" + Chr(13) + Chr(13) + Chr(10) + _"输入数据吗?", vbApplicationModal + vbDefaultButton1 + vbQuestion _+ vbYesNo, "无数据提示:")Select Case intResultCase vbYesMsgBox "输入数据,请按输入数据按扭。

", vbApplicationModal + _vbInformation, "输入数据提示:"Exit SubCase vbNoMsgBox "很抱歉!没有数据,无法检验!", vbApplicationModal + vbInformation, _ "无数据提示:"Exit SubEnd SelectEnd If.MoveFirst.MoveLastn02 = .RecordCount ' 确定记录总数' n02 = 20End With网络检验数据表.Data1.Recordset.MoveFirstEE2 = n02' frm训练误差.Data1.Recordset.MoveFirst' frm检1误差.Data1.Recordset.MoveFirst' 初始化处理myForm6.KeyPreview = Truemand8.Visible = FalsemyForm6.Picture1.ClsCall csqz ' 初始权值aE0 = Val(myForm6.Text1.Text) ' 误差限nn = Val(bo1.Text) ' 中间层节点数For i = 1 To nn: aW2(i) = 0: aW20(i) = 0: Next iFor i = 1 To ttFor k1 = 1 To nnaW1(i, k1) = 0aW10(i, k1) = 0Next k1Next ikk2 = 0ii1 = 0bel10.Visible = Truebel10.Caption = "程序正在运行,请稍候......; 终止运行按Esc键,暂停按Pause。