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

📄 annbp.c

📁 bp神经网络 c语言程序
💻 C
字号:
/*********************************************************************/
/*                                                                   */
/*             Artificial  Neurul  Net   Work   Program              */
/*********************************************************************/

 #include "stdio.h"
 #include "stdlib.h"
 #include "math.h"
 #include "ctype.h"
 #include "string.h"
 #include "graphics.h"
 #define nO1 10            /*output nodes*/
 #define nH1 19            /*hidden nodes*/
 #define nI1 6		   /*input nodes*/
 #define nP1 120
 #define c   30
 double w1[nH1][nI1];	  /*weights input-hidden layers*/
 double w2[nO1][nH1];	   /*weights hidden-output layer*/
 float out0[nP1][nI1];
 float out1[nP1][nH1];
 float out2[nP1][nO1];
 float targ[nP1][nO1];
 float out00[nP1][nI1];
 float out11[nP1][nH1];
 float out22[nP1][nO1];
 float targ1[nP1][nO1];
 float delta1[nP1][nH1];
 float delta2[nP1][nO1];
 float delw1[nH1][nI1];
 float delw2[nO1][nH1];
 float sep[120];
 float  eta;                    /*default learing rate*/
 float  alpha;                   /*default momentum factor*/
 float  Errorlevel;            /*satisfactory error level*/
 float  error;                       /*latest sum squared error value*/
 int N,nI,D,nH,M;
 int cc;

/***********************************************************/
	  void  read_patterns()
   {FILE *fp;
    int p,i,j,h;
    char fname[20],fpp[20];
     printf("\n How many input nodes?");
     scanf("%d",&nI);
     printf("\n How many hidden nodes?");
     scanf("%d",&nH);
     printf("\n How many output nodes?");
     scanf("%d",&M);
     printf("\n Tatal number of input patterns?");
     scanf("%d",&D);
     printf("\n Momentum factor(0.02---0.75)?");
     scanf("%f",&alpha);
     printf("\n Learning rate(0.1--0.9)?");
     scanf("%f",&eta);
     printf("\n Terminate when error stisfactory(0.001)?");
     scanf("%f",&Errorlevel);
     printf("\n How many time iteraction(1000)?");
     scanf("%d",&N);
     printf("\n Input patterns file name :");
     scanf("%s",fname);
     strcpy(fpp,fname);
     strcat(fpp,".dat");
     if((fp=fopen(fpp,"r"))==NULL)
     {printf("\n File %s does not exit");
		   exit(0);
     }
	for(p=0;p<D;p++)
	{for(i=0;i<nI;i++)
	 {fscanf(fp,"%f",&out0[p][i]);
	 printf("%6.3f ",out0[p][i]);
	 }
	for(j=0;j<M;j++)
    {fscanf(fp,"%f",&targ[p][j]);
   printf("%6.3f ",targ[p][j]);}
    printf("\n");
	  }
   printf("\n");
   fclose(fp);
   }
/**********************************************************/
     void data()
 {float max[10];
 int i,j,p;
 for(j=0;j<M;j++)
 {max[j]=out0[0][j];
 for(p=0;p<D;p++)
 if(out0[p][j]>max[j])
 max[j]=out0[p][j];}
 for(j=0;j<M;j++)
  {if(max[j]>0&&max[j]<=1)max[j]=1.0;
  if(max[j]>1&&max[j]<=10)max[j]=10.0;
  if(max[j]>10&&max[j]<=100)max[j]=100.0;
  if(max[j]>100&&max[j]<=1000)max[j]=1000.0;
  if(max[j]>1000&&max[j]<=10000)max[j]=10000.0;
  if(max[j]>10000&&max[j]<=100000)max[j]=100000.0;
  }
 for(j=0;j<M;j++)
 for(p=0;p<D;p++)
 out0[p][j]=out0[p][j]/max[j];
  for(p=0;p<D;p++)
    { for(j=0;j<M;j++)
     printf("%f ",out0[p][j]);
     printf("\n");}
  }
 /***************************************************************/
    void random_w()
   {long rd=568731L;
   int p,i,h,j,rand;
   for(h=0;h<nH;h++)
  for(i=0;i<=nI;i++)
   {rd=15625L*rd+22221L;
    rand=(rd>>16)&0x7FFF;
  w1[h][i]=rand/pow(2.0,15.0)-0.5;
  delw1[h][i]=0.0;
       }
 for(h=0;h<nH;h++)
   {for(i=0;i<=nI;i++)
  printf("%.3f ",w1[h][i]);
  printf("\n");}
  rd=568731L;
  for(j=0;j<M;j++)
 for(h=0;h<=nH;h++)
 {rd=15625L*rd+22221L;
 rand=(rd>>16)&0x7FFF;
 w2[j][h]=rand/pow(2.0,15.0)-0.5;
 delw2[j][h]=0.0;
      }
 for(j=0;j<M;j++)
  { for(h=0;h<=nH;h++)
  printf("%6.3f ",w2[j][h]);
    printf("\n");}
    }
 /**************************************************************/
      void net_work(int p)
 { int i,j,h;
   float sum1,sum2;
  /*hidden layer sum input to hidden layer over allinput weight combinations*/
  for(h=0;h<nH;++h)
  {sum1=w1[h][nI]*1.0;
  for(i=0;i<nI;++i)
  sum1+=w1[h][i]*out0[p][i];
  out1[p][h]=1.0/(1.0+exp(-sum1)); }
     /*output layer*/
  for(j=0;j<M;j++)
 {sum2=w2[j][nH]*1.0;
 for(h=0;h<nH;h++)
 sum2+=w2[j][h]*out1[p][h];
 out2[p][j]=1.0/(1.0+exp(-sum2));
 /*printf("%f",out2[p][j]);*/
    }
    }
 /*end net-work*/
/*********************************************************************/
 void net_work1(int p)
 { int i,j,h;
 float sum1,sum2;
   /*hidden layer sum input to hidden layer over allinput weight combinations*/
  for(h=0;h<nH;++h)
  {sum1=w1[h][nI]*1.0;
  for(i=0;i<nI;++i)
  sum1+=w1[h][i]*out00[p][i];
  out11[p][h]=1.0/(1.0+exp(-sum1)); }
  /*output layer*/
  for(j=0;j<M;j++)
  {sum2=w2[j][nH]*1.0;
  for(h=0;h<nH;h++)
  sum2+=w2[j][h]*out11[p][h];
  out22[p][j]=1.0/(1.0+exp(-sum2));
      printf("%f",out22[p][j]);
    }
  /*end net-work*/
  }
  /******************************************************************/

/***********************************************************************/
   net_learning()
  {FILE *efp;
  int p,q,j,h,i,k;
  float err;
  float sep[120],ep[120][10],del2[6];
  double sum,dw;
  if((efp=fopen("error.dat","w"))==NULL)
  printf("not exit");
  err=0;
  for(q=0;q<N;q++)
  { for(p=0;p<D;p++)
  {sep[p]=0;
   net_work(p);
  /*delts output compute deltas for each output node for one epoch*/
    for(j=0;j<M;j++)
  {del2[j]=(targ[p][j]-out2[p][j]);
  delta2[p][j]=out2[p][j]*(1.0-out2[p][j])*del2[j];
  ep[p][j]=0.5*del2[j]*del2[j];
  sep[p]=sep[p]+ep[p][j];  }
   err=err+sep[p];
    /* printf("%f",err);*/
    /*delta hidden*/
  for(h=0;h<nH;h++)
  {sum=0.0;
  for(j=0;j<M;j++)
  sum+=delta2[p][j]*w2[j][h];
  delta1[p][h]=sum*out1[p][h]*(1.0-out1[p][h]);
	     }
  /* p*/
  /*adapt weights hidden:output*/
  for(j=0;j<M;j++)
  for(h=0;h<nH;h++)
  {delw2[j][h]=eta*delta2[p][j]*out1[p][h];
  w2[j][h]=w2[j][h]+delw2[j][h];
   /*calculate\ new bias weights for each output unit*/
   }
      /* calculate new weights*/
   for(h=0;h<nH;h++)
   for(i=0;i<nI;i++)
  {delw1[h][i]=eta*delta1[p][h]*out0[p][i];
   w1[h][i]=w1[h][i]+delw1[h][i];
   }
   /* adapt weights input:hidden*/
   for(h=0;h<nH;h++)
  {for(i=0;i<nI;i++)
   /*calculate new bias weights for each hidden unit*/
   dw=eta*delta1[p][h];
   w1[h][nI]+=dw;
   }/* calculate new weights*/
   for(j=0;j<M;j++)
    {
     for(h=0;h<nH;h++)
    dw=delta2[p][h]*eta;
    w2[h][nI]+=dw;
     }
     }
   err=sqrt(err/115);
  if(err<0.001)
  { printf("\n Terminate error satisfacory %f",err);
  fclose(efp);
   break;}
   }
 /*sum squared error*/
  /*end of iterminte*/
 fprintf(efp,"\n%d %f ",q,err);
  printf("iteraction stop");
 fclose(efp);}
 /*end learning*/
 /***********************************************************************/
 net_output()
 { int p,j,i,h;
 FILE *net,*fp6;
  if((net=fopen("net-w.dat","w+"))==NULL)
	{printf("\n File can not open");
	exit(0);
	}
   if((fp6=fopen("w.dat","w"))==NULL)
	{printf("\n File can not open");
	exit(0);
	}
  fprintf(net,"%d %d %d %d %f %f %f %d",nI,nH,M,D,eta,alpha,Errorlevel,N);
  fprintf(net,"\n");
  for(p=0;p<D;p++)
   {for(j=0;j<M;j++)
  {fprintf(net,"%f ",targ[p][j]);
  printf("%6.3f",targ[p][j]);
     }
   for(j=0;j<M;j++)
   {fprintf(net," %f ",out2[p][j]);
    printf("%6.3f",out2[p][j]);
    }
    fprintf(net,"\n");
     printf("\n");}
   for(h=0;h<nH;h++)
  {for(i=0;i<nI;i++)
  {fprintf(fp6,"%f ",w1[h][i]);
   printf("%f",w1[h][i]);}
  fprintf(fp6,"\n");
   printf("\n");
     }
   for(j=0;j<M;j++)
  {for(h=0;h<nH;h++)
  {printf("%f\n",w2[j][h]);
   fprintf(fp6,"%f ",w2[j][h]);}
   fprintf(fp6,"\n");
   printf("\n");
   }
   fclose(net);
      }
/**************************************************************/
   net_input()
  {int p,i,j,h;
   FILE *nett;
   if((nett=fopen("net-w.dat","r"))==NULL)
	{printf("\n File can not open");
	exit(0);
	}
   fscanf(nett,"%d %d %d %d %f %f %f %d",nI,nH,M,D,eta,alpha,Errorlevel,N);
  for(p=0;p<D;p++)
  for(j=0;j<M;j++)
  fscanf(nett,"

⌨️ 快捷键说明

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