?? 神經(jīng)網(wǎng)絡(luò)bp.txt
字號:
m_isOK=true;
else
m_isOK=false;
}
void CBpNet::stop()
{
m_IsStop=true;
}
double CBpNet::randab(double a, double b)
{ //注意,如果應(yīng)用矩陣庫,頭文件matlib.h對rand()函數(shù)重新定義,只產(chǎn)生(0,1)
//之間的隨機數(shù)
return((b-a)*rand()+a);
}
//將數(shù)據(jù)轉(zhuǎn)化到(0,1)區(qū)間
void CBpNet::normalize()
{
int i,j;
//輸入數(shù)據(jù)范圍
mInputNormFactor=scope(mSampleInput);
//目標數(shù)據(jù)范圍
mTargetNormFactor=scope(mSampleTarget);
for(i=1;i<=mSampleInput.rows();i++)
for(j=1;j<=mSampleInput.cols();j++)
mSampleInput.r(i,j)=(mSampleInput.r(i,j)-mInputNormFactor.r(j,1))/(mInputNo
rmFactor.r(j,2)-mInputNormFactor.r(j,1));
for(i=1;i<=mSampleTarget.rows();i++)
for(j=1;j<=mSampleTarget.cols();j++)
mSampleTarget.r(i,j)=(mSampleTarget.r(i,j)-mTargetNormFactor.r(j,1))/(mTarg
etNormFactor.r(j,2)-mTargetNormFactor.r(j,1));
}
//前向計算
void CBpNet::forward(int iSample)
{//根據(jù)第iSample個樣本,前向計算
if(iSample<1||iSample>mSampleInput.rows()){
MessageBox(NULL,"無此樣本數(shù)據(jù):索引出界!","無此樣本數(shù)據(jù):索引出界!",MB_OK);
return;
}
int i,j;
double sum=0.0;
//輸入層數(shù)據(jù)
for(i=1;i<=iInput;i++)
mInput.r(i)=mSampleInput.r(iSample,i);
//隱層數(shù)據(jù)
for(j=1;j<=iHidden;j++){
sum=0.0;
for(i=1;i<=iInput;i++)
sum+=mInput.r(i)*mWeighti.r(i,j);
sum-=mThresholdi.r(j);
mHidden.r(j)=1.0/(1.0+exp(-sum));
}
//輸出數(shù)據(jù)
for(j=1;j<=iOutput;j++){
sum=0.0;
for(i=1;i<=iHidden;i++)
sum+=mHidden.r(i)*mWeighto.r(i,j);
sum-=mThresholdo.r(j);
mOutput.r(j)=1.0/(1.0+exp(-sum));
}
}
//后向反饋
void CBpNet::backward(int iSample)
{
if(iSample<1||iSample>mSampleInput.rows()){
MessageBox(NULL,"無此樣本數(shù)據(jù):索引出界!","無此樣本數(shù)據(jù):索引出界!",MB_OK);
return;
}
int i,j;
//輸出誤差
for(i=1;i<=iOutput;i++)
mOutputDeltas.r(i)=mOutput.r(i)*(1-mOutput.r(i))*(mSampleTarget.r(iSample,i)
-mOutput.r(i));
//隱層誤差
double sum=0.0;
for(j=1;j<=iHidden;j++){
sum=0.0;
for(i=1;i<=iOutput;i++)
sum+=mOutputDeltas.r(i)*mWeighto.r(j,i);
mHiddenDeltas.r(j)=mHidden.r(j)*(1-mHidden.r(j))*sum;
}
//更新隱層-輸出權(quán)重
double dblChange;
for(j=1;j<=iHidden;j++)
for(i=1;i<=iOutput;i++){
dblChange=mOutputDeltas.r(i)*mHidden.r(j);
mWeighto.r(j,i)=mWeighto.r(j,i)+dblLearnRate2*dblChange+dblMomentumFactor*m
Changeo.r(j,i);
mChangeo.r(j,i)=dblChange;
}
//更新輸入-隱層權(quán)重
for(i=1;i<=iInput;i++)
for(j=1;j<=iHidden;j++){
dblChange=mHiddenDeltas.r(j)*mInput.r(i);
mWeighti.r(i,j)=mWeighti.r(i,j)+dblLearnRate1*dblChange+dblMomentu
mFactor*mChangei.r(i,j);
mChangei.r(i,j)=dblChange;
}
//修改闕值
for(j=1;j<=iOutput;j++)
mThresholdo.r(j)-=dblLearnRate2*mOutputDeltas.r(j);
for(i=1;i<=iHidden;i++)
mThresholdi.r(i)-=dblLearnRate1*mHiddenDeltas.r(i);
//計算誤差
dblErr=0.0;
for(i=1;i<=iOutput;i++)
dblErr+=0.5*(mSampleTarget.r(iSample,i)-mOutput.r(i))*(mSampleTarget.r(iSamp
le,i)-mOutput.r(i));
}
//求數(shù)據(jù)列的范圍
Mm CBpNet::scope(Mm mData)
{Mm mScope;
mScope=zeros(mData.cols(),2);
double min,max;
for(int i=1;i<=mData.cols();i++){
min=max=mData.r(1,i);
for(int j=1;j<=mData.rows();j++){
if(mData.r(j,i)>=max)
max=mData.r(j,i);
if(mData.r(j,i)<=min)
min=mData.r(j,i);
}
if(min==max)
min=0.0;
mScope.r(i,1)=min;
mScope.r(i,2)=max;
}
return(mScope);
}
//顯示矩陣數(shù)據(jù),方便調(diào)試
void CBpNet::display(Mm data)
{CString strData,strTemp;
int i=1,j=1;
for(i=1;i<=data.rows();i++){
for(j=1;j<=data.cols();j++){
strTemp.Format("%.3f ",data.r(i,j));
strData+=strTemp;
}
strData=strData+"\r\n";
}
::MessageBox(NULL,strData,"",MB_OK);
}
void CBpNet::Serialize(CArchive &ar)
{CObject::Serialize(ar);
/////////////////////////////////////
if(ar.IsStoring()){
int i,j;
double dblData;
CString strTemp="Bp";
ar<<strTemp;//寫入標志
//紀錄神經(jīng)元個數(shù)
ar<<iInput<<iHidden<<iOutput;
//紀錄權(quán)值
for(i=1;i<=iInput;i++)
for(j=1;j<=iHidden;j++){
dblData=mWeighti.r(i,j);
ar<<dblData;
}
for(i=1;i<=iHidden;i++)
for(j=1;j<=iOutput;j++){
dblData=mWeighto.r(i,j);
ar<<dblData;
}
//記錄權(quán)值變化
for(j=1;j<=iHidden;j++)
for(i=1;i<=iOutput;i++)
ar<<mChangeo.r(j,i);
//輸入-隱層權(quán)重變化
for(i=1;i<=iInput;i++)
for(j=1;j<=iHidden;j++)
ar<<mChangei.r(i,j);
//紀錄闕值
for(i=1;i<=iHidden;i++){
dblData=mThresholdi.r(i);
ar<<dblData;
}
for(i=1;i<=iOutput;i++){
dblData=mThresholdo.r(i);
ar<<dblData;
}
//紀錄輸入輸出的極值
for(i=1;i<=iInput;i++){
dblData=mInputNormFactor.r(i,1);
ar<<dblData; //極小值
dblData=mInputNormFactor.r(i,2);
ar<<dblData; //極大值
}
for(i=1;i<=iOutput;i++)
{dblData=mTargetNormFactor.r(i,1);
ar<<dblData; //輸出數(shù)據(jù)極小值
dblData=mTargetNormFactor.r(i,2);
ar<<dblData;
}
//誤差范圍
ar<<dblMse;
//學習速率
ar<<dblLearnRate1<<dblLearnRate2;
}
else{
int i,j;
CString strTemp="";
double dblTemp;
ar>>strTemp;//讀入標志
//讀入神經(jīng)元個數(shù)
ar>>iInput>>iHidden>>iOutput;
mChangei=zeros(iInput,iHidden);
mChangeo=zeros(iHidden,iOutput);
mWeighti=zeros(iInput,iHidden);
mWeighto=zeros(iHidden,iOutput);
//讀入權(quán)值
for(i=1;i<=iInput;i++)
for(j=1;j<=iHidden;j++)
{ ar>>dblTemp;
mWeighti.r(i,j)=dblTemp;
}
for(i=1;i<=iHidden;i++)
for(j=1;j<=iOutput;j++)
{ ar>>dblTemp;
mWeighto.r(i,j)=dblTemp;
}
//讀入權(quán)值變化
for(j=1;j<=iHidden;j++)
for(i=1;i<=iOutput;i++)
ar>>mChangeo.r(j,i);
//輸入-隱層權(quán)重
for(i=1;i<=iInput;i++)
for(j=1;j<=iHidden;j++)
ar>>mChangei.r(i,j);
//讀入闕值
mThresholdi=zeros(1,iHidden);
for(i=1;i<=iHidden;i++)
{ar>>dblTemp;
mThresholdi.r(i)=dblTemp;
}
mThresholdo=zeros(1,iOutput);
for(i=1;i<=iOutput;i++)
{ar>>dblTemp;
mThresholdo.r(i)=dblTemp;
}
//讀入輸入輸出的極值
mInputNormFactor=zeros(iInput,2);
for(i=1;i<=iInput;i++){
ar>>dblTemp;
mInputNormFactor.r(i,1)=dblTemp; //極小值
ar>>dblTemp;
mInputNormFactor.r(i,2)=dblTemp; //極大值
}
mTargetNormFactor=zeros(iOutput,2);
for(i=1;i<=iOutput;i++)
{ar>>dblTemp;
mTargetNormFactor.r(i,1)=dblTemp; //輸出數(shù)據(jù)極小值
ar>>dblTemp;
mTargetNormFactor.r(i,2)=dblTemp;
}
//讀入誤差范圍
ar>>dblMse;
//讀入學習速率
ar>>dblLearnRate1>>dblLearnRate2;
//創(chuàng)建計算用的單個樣本矩陣
mInput=zeros(1,iInput);
mHidden=zeros(1,iHidden);
mOutput=zeros(1,iOutput);
//誤差矩陣
mOutputDeltas=zeros(iOutput);
mHiddenDeltas=zeros(iHidden);
}
}
//如果不是新網(wǎng)絡(luò),比如從文件恢復的網(wǎng)絡(luò),調(diào)用此函數(shù)構(gòu)建學習樣本
void CBpNet::LoadPattern(Mm mIn, Mm mOut)
{ if(mIn.cols()!=iInput||mOut.cols()!=iOutput){
::MessageBox( NULL,"學習樣本格式錯誤!","錯誤",MB_OK);
return;
}
mSampleInput=zeros(mIn.rows(),mIn.cols());
mSampleTarget=zeros(mOut.rows(),mOut.cols());
mSampleInput=mIn;
mSampleTarget=mOut;
m_isOK=false;
m_IsStop=false;
lEpochs=0;
dblMomentumFactor=0.95;
dblError=1.0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -