⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bp.cpp

📁 BP神经网络的一个应用示例:水果识别。先学习
💻 CPP
字号:
#include "stdafx.h"
#include "bpex.h"
#include "bp.h"
#include <math.h>


double sigmf(double u);
void wgtinit(double w[],int sl);
void forwardcp(int ft,int bk,double w[],double in[],double out[],double cw[]);
void Bpcal(int p);

void init()
{
	wgtinit((double*)dblWeight_IN_HD,INPUT_NUMBER*HIDE_NUMBER);
	wgtinit((double*)dblWeight_HD_OT,HIDE_NUMBER*OUT_NUMBER);
	wgtinit(CW_HD,HIDE_NUMBER);
	wgtinit(CW_OT,OUT_NUMBER);
};

double go_one_step()//for each input start learn
{
	int i,p;
	double Err,Errp;
	for(p=0;p<SpNUM;p++){
		for(i=0;i<INPUT_NUMBER;i++)
			dblOut_IN[i]=X[p][i];
		
		/*forward computation*/
		forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,dblOut_IN,dblOut_HD,CW_HD);
		forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);

		/*adjust weight*/
		Bpcal(p);
	}
	/*compute the error*/
	Err=0;
	for(p=0;p<SpNUM;p++){
		for(i=0;i<INPUT_NUMBER;i++)
			dblOut_IN[i]=X[p][i];

		/*forward computation*/
		forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,dblOut_IN,dblOut_HD,CW_HD);
		forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);

		for(i=0;i<OUT_NUMBER;i++)
			OT[p][i]=dblOut_OT[i];
		
		Errp=0;
		for(i=0;i<OUT_NUMBER;i++)
		{
			Errp+=0.5*(T[p][i]-OT[p][i])*(T[p][i]-OT[p][i]);
		}
		Err+=Errp;
	}
	return Err;	
}

double recognize( double* to_recog )
{
	double result = -1;
	forwardcp(INPUT_NUMBER,HIDE_NUMBER,(double*)dblWeight_IN_HD,to_recog,dblOut_HD,CW_HD);
	forwardcp(HIDE_NUMBER,OUT_NUMBER,(double*)dblWeight_HD_OT,dblOut_HD,dblOut_OT,CW_OT);

	for(int i=0;i<3;i++)
	{
		switch (i)
		{
		case 0:
			if (dblOut_OT[i]>=0.8)
				return 1;
			break;
		case 1:

			if (dblOut_OT[i]<0.5)
				//&&(dblOut_OT[i]<0.8))
				result= 0.5;
			break;
		case 2:
			if (dblOut_OT[i]>0.75)
				return 0.25;
			break;
		}
	}
return result;

	
}


void forwardcp(int ft,int bk,double w[],double in[],double out[],double cw[])
{int i,j;
 double sum;
 for(j=0;j<bk;j++){
	sum=0;
	for(i=0;i<ft;i++){
		sum=sum+w[j*ft+i]*in[i];
	}
	//sum-=cw[j];
	out[j]=sigmf(sum);
 }

}
/************************************************/
void Bpcal(int p)//for one input(p) compute weight.
{
	int i,j,k;
	double ajtW;
	double ntdelsum;

	for(j=0;j<OUT_NUMBER;j++){
		delta_OT[j]=dblOut_OT[j]*(1-dblOut_OT[j])*(T[p][j]-dblOut_OT[j]);
		CW_OT[j]+=BETA*delta_OT[j];
		for(i=0;i<HIDE_NUMBER;i++){
			ajtW=YINO*delta_OT[j]*dblOut_HD[i];
			dblWeight_HD_OT[j][i] += ajtW;
		}
	}


	for(j=0;j<HIDE_NUMBER;j++){
		ntdelsum=0;
		for(k=0;k<OUT_NUMBER;k++){
			ntdelsum += delta_OT[k]*dblWeight_HD_OT[k][j];
		}
		delta_HD[j]=dblOut_HD[j]*(1-dblOut_HD[j])*ntdelsum;
		CW_HD[j] += BETA*delta_HD[j];
		for(i=0;i<INPUT_NUMBER;i++){
			ajtW=YINO*delta_HD[j]*dblOut_IN[i];
			dblWeight_IN_HD[j][i] += ajtW;
		}
	}
}

void wgtinit(double w[],int sl)
{int i;
 double drand48();
 for(i=0;i<sl;i++){
	*(w+i)=0.2*drand48();
	}
}

double drand48()
{double d;
 d=(double) rand()/32767.0;
 return d;
}

double sigmf(double u)	/*sigmoid function*/
{double su;
 su=-u/U0;
 su=1/(1.0+exp(su));
 //if(su>0.9) su=1; else if (su<0.1) su=0;

 return su;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -