反向传播算法也称BP算法由于这种算法在本质上是一种神.docx
《反向传播算法也称BP算法由于这种算法在本质上是一种神.docx》由会员分享,可在线阅读,更多相关《反向传播算法也称BP算法由于这种算法在本质上是一种神.docx(20页珍藏版)》请在冰点文库上搜索。
![反向传播算法也称BP算法由于这种算法在本质上是一种神.docx](https://file1.bingdoc.com/fileroot1/2023-5/24/33925a7e-b81a-4802-ae1f-2d422ee39305/33925a7e-b81a-4802-ae1f-2d422ee393051.gif)
反向传播算法也称BP算法由于这种算法在本质上是一种神
反向传播算法也称BP算法。
由于这种算法在本质上是一种神经网络学习的数学模型,所以,有时也称为BP模型。
BP算法是为了解决多层前向神经网络的权系数优化而提出来的;所以,BP算法也通常暗示着神经网络的拓扑结构是一种无反馈的多层前向网络,它含有输人层、输出层以及处于输入输出层之间的中间层。
中间层有单层或多层,由于它们和外界没有直接的联系,故也称为隐层。
在隐层中的神经元也称隐单元。
隐层虽然和外界不连接.但是,它们的状态则影响输入输出之间的关系。
这也是说,改变隐层的权系数,可以改变整个多层神经网络的性能。
'程序实现功能:
模拟QQ截屏
PrivatemW1()AsDouble '隐含层的权值 S1 X R
PrivatemW2()AsDouble '输出层的权值 S2 X R
PrivatemB1()AsDouble '隐含层的偏置值 S1 X 1
PrivatemB2()AsDouble '输出层的偏置值 S2 X 1
PrivatemErr()AsDouble '均方误差
PrivatemMinMax()AsDouble '输入向量的上下限 R X 2
PrivatemS1AsLong '隐含层的神经元个数 S1
PrivatemS2AsLong '输出层的神经元个数 S2
PrivatemRAsLong '输入层神经元个数 R
PrivatemGoalAsDouble '收敛的精度
PrivatemLrAsDouble '学习速度
PrivatemGamaAsDouble '动量系数
PrivatemMaxEpochsAsLong '最大的迭代次数
PrivatemIterationAsLong '实际的迭代次数
'**************************************** 中间变量 *******************************************
PrivateHiddenOutput()AsDouble '隐含层的输出
PrivateOutOutput()AsDouble '输出层的输出
PrivateHiddenErr()AsDouble '隐含层各神经元的误差
PrivateOutPutErr()AsDouble '输出层各神经元的误差
PrivatePdealing()AsDouble '当前正在处理的输入
PrivateTdealing()AsDouble '当前正在处理的输入对应的输出
PrivateOldW1()AsDouble '旧权值数组
PrivateOldW2()AsDouble '旧权值数组
PrivateOldB1()AsDouble '旧偏置值数组
PrivateOldB2()AsDouble '旧偏置值数组
PrivateTsAsLong '输入向量的总个数
PrivateInitializedAsBoolean '是否已初始化
'**************************************** 属性 *******************************************
PublicEventUpdate(iteration)
PublicPropertyGetW1()AsDouble()
W1=mW1
EndProperty
PublicPropertyGetW2()AsDouble()
W2=mW2
EndProperty
PublicPropertyGetB1()AsDouble()
B1=mB1
EndProperty
PublicPropertyGetB2()AsDouble()
B2=mB2
EndProperty
PublicPropertyGetErr()AsDouble()
Err=mErr
EndProperty
PublicPropertyGetS1()AsLong
S1=mS1
EndProperty
PublicPropertyLetS1(ValueAsLong)
mS1=Value
EndProperty
PublicPropertyGetS2()AsLong
S2=mS2
EndProperty
PublicPropertyGetR()AsLong
R=mR
EndProperty
PublicPropertyGetGoal()AsDouble
Goal=mGoal
EndProperty
PublicSubMinMax(Value()AsDouble)
mMinMax=Value
EndSub
PublicPropertyLetGoal(ValueAsDouble)
mGoal=Value
EndProperty
PublicPropertyGetLr()AsDouble
Lr=mLr
EndProperty
PublicPropertyLetLr(ValueAsDouble)
mLr=Value
EndProperty
PublicPropertyGetGama()AsDouble
Gama=mGama
EndProperty
PublicPropertyLetGama(ValueAsDouble)
mGama=Value
EndProperty
PublicPropertyGetMaxEpochs()AsLong
MaxEpochs=mMaxEpochs
EndProperty
PublicPropertyLetMaxEpochs(ValueAsLong)
mMaxEpochs=Value
EndProperty
PublicPropertyGetiteration()AsLong
iteration=mIteration
EndProperty
'**************************************** 初始化 *******************************************
PrivateSubClass_Initialize()
mS1=5
mGoal=0.0001
mLr=0.1
mGama=0.8
mMaxEpochs=1000
EndSub
'*********************************** 训练 ***********************************
'
'过程名:
Train
'参 数:
P - 输入矩阵
' T -输出矩阵
'作 者:
laviewpbt
'时 间:
2006-11-15
'
'*********************************** 训练 ***********************************
PublicSubTrain(P()AsDouble,T()AsDouble)
DimiAsLong,jAsLong,IndexAsLong
DimNmP()AsDouble
mR=UBound(P,1) '输入向量的元素个数
mS2=UBound(T,1) '输出层神经元的个数
Ts=UBound(P,2) '输入向量的个数
NmP=CopyArray(P) '保留原始的P,因为正规化的过程中会破坏原始数据
IniParametersNmP '初始化参数和数组
mIteration=0
Fori=1TomMaxEpochs
mIteration=mIteration+1
Index=Int(Rnd*Ts+1) '随机选取一个输入向量作为训练样本,这样效果比按顺序循环要好
Forj=1TomR
Pdealing(j)=NmP(j,Index) '正在处理的输入向量
Next
Forj=1TomS2
Tdealing(j)=T(j,Index) '正在处理的输出向量
Next
HiddenLayer '计算隐含层各神经元的输出
OutputLayer '计算输出层各神经元的输出
OutError '计算输出层各神经元的误差
HiddenError '计算隐含层各神经元的误差
Update_W2B2 '更新隐含层至输出层之间的连接权及输出层节点的偏置值
Update_W1B1 '更新输入层至隐含层之间的连接权及隐含层节点的偏置值
IfiterationMod1000=0ThenRaiseEventUpdate(mIteration)
IfmErr(mIteration) Next
EndSub
'*********************************** 初始化数据 ***********************************
PrivateSubIniParameters(P()AsDouble)
DimiAsLong,jAsLong
ReDimmW1(mS1,mR)AsDouble,mW2(mS2,mS1)AsDouble
ReDimmB1(mS1)AsDouble,mB2(mS2)AsDouble
ReDimOldW1(mS1,mR)AsDouble,OldW2(mS2,mS1)AsDouble
ReDimOldB1(mS1)AsDouble,OldB2(mS2)AsDouble
ReDimHiddenOutput(mS1)AsDouble,OutOutput(mS2)AsDouble
ReDimHiddenErr(mS1)AsDouble,OutPutErr(mS2)AsDouble
ReDimPdealing(mR)AsDouble,Tdealing(mS2)AsDouble
ReDimmErr(mMaxEpochs)AsDouble
Randomize
Fori=1TomS1
mB1(i)=2*Rnd-1
Forj=1TomR
mW1(i,j)=2*Rnd-1
Next
Next
Fori=1TomS2
mB2(i)=2*Rnd-1
Forj=1TomS1
mW2(i,j)=2*Rnd-1
Next
Next
NormalizeInputP
Initialized=True
EndSub
'*********************************** 输入数据影射到-1和1之间 ***********************************
PrivateSubNormalizeInput(P()AsDouble)
DimiAsInteger,jAsInteger,mAsInteger,nAsInteger
m=UBound(P,1):
n=UBound(P,2)
Fori=1Tom
Forj=1Ton
P(i,j)=2*(P(i,j)-mMinMax(i,1))/(mMinMax(i,2)-mMinMax(i,1))-1
Next
Next
EndSub
'*********************************** 隐含层的数据 ***********************************
PrivateSubHiddenLayer()
DimiAsLong,jAsLong
DimSumAsDouble
Fori=1TomS1
Sum=0
Forj=1TomR
Sum=Sum+mW1(i,j)*Pdealing(j)
Next
HiddenOutput(i)=1/(1+Exp(-(Sum+mB1(i))))
Next
EndSub
'*********************************** 输出层的数据 ***********************************
PrivateSubOutputLayer()
DimiAsLong,jAsLong
DimSumAsDouble
Fori=1TomS2
Sum=0
Forj=1TomS1
Sum=Sum+mW2(i,j)*HiddenOutput(j)
Next
OutOutput(i)=Sum+mB2(i)
Next
EndSub
'*********************************** 输出层的误差 ***********************************
PrivateSubOutError()
DimiAsLong,jAsLong,MseAsDouble
Fori=1TomS2
OutPutErr(i)=Tdealing(i)-OutOutput(i)
Mse=Mse+OutPutErr(i)*OutPutErr(i)
Next
mErr(mIteration)=Sqr(Mse/mS2) '用某次迭代的均方误差来代替整体的均方误差
EndSub
'*********************************** 隐含层的误差 ***********************************
PrivateSubHiddenError()
DimiAsLong,jAsLong
DimSumAsDouble
Fori=1TomS1
Sum=0
Forj=1TomS2
Sum=Sum+OutPutErr(j)*mW2(j,i)
Next
HiddenErr(i)=Sum*(HiddenOutput(i))*(1-HiddenOutput(i))
Next
EndSub
'*********************************** 更新输出层的权值和偏置值 ***********************************
PrivateSubUpdate_W2B2()
DimiAsLong,jAsLong
DimTempAsDouble
Fori=1TomS2
Forj=1TomS1
Temp=mLr*OutPutErr(i)*HiddenOutput(j)+mGama*OldW2(i,j)'动量学习方法
mW2(i,j)=mW2(i,j)+Temp
OldW2(i,j)=Temp
Next
Temp=mLr*OutPutErr(i)+mGama*OldB2(i)
mB2(i)=mB2(i)+Temp
OldB2(i)=Temp
Next
EndSub
'*********************************** 更新隐含层的权值和偏置值 ***********************************
PrivateSubUpdate_W1B1()
DimiAsLong,jAsLong
DimTempAsDouble
Fori=1TomS1
Forj=1TomR
Temp=mLr*HiddenErr(i)*Pdealing(j)+mGama*OldW1(i,j)
mW1(i,j)=mW1(i,j)+Temp
OldW1(i,j)=Temp
Next
Temp=mLr*HiddenErr(i)+mGama*OldB1(i)
mB1(i)=mB1(i)+Temp
OldB1(i)=Temp
Next
EndSub
'*********************************** 均方误差 ***********************************
'PrivateFunctionMse(P()AsDouble,T()AsDouble)AsDouble
'DimTemp()AsDouble
'DimiAsInteger,jAsInteger,SumAsDouble,SubsAsDouble
'Temp=Sim(P)
'Fori=1TomS2
'Forj=1ToTs
'Subs=Temp(i,j)-T(i,j)
'Sum=Sum+Subs*Subs
'Next
'Next
'Mse=Sum/mS2/Ts
'EndFunction
'*********************************** 复制数组 ***********************************
PrivateFunctionCopyArray(P()AsDouble)AsDouble()
CopyArray=P
EndFunction
PublicFunctionSim(P()AsDouble)AsDouble()
DimiAsInteger,jAsInteger,kAsInteger
DimRAsInteger,TAsInteger
DimHiddenOut()AsDouble,OutOut()AsDouble,NmP()AsDouble
R=UBound(P,1):
T=UBound(P,2)
ReDimHiddenOut(mS1,T)AsDouble,OutOut(mS2,T)AsDouble
IfInitialized=FalseThenExit