home *** CD-ROM | disk | FTP | other *** search
- /*NetLib.c Core routines for neural Network.
-
- This file is Copyright 1989 by Pierce T. Wetter III
-
- Permission granted for all non-commercial uses of this code. For commercial uses of this code
- contact me at
-
- Pierce T. Wetter III
- 45 Vista Lago Dr.
- Simi Valley, CA 93065
-
- or
-
- wetter@csvax.caltech.edu or pwetter@caltech.bitnet
-
- */
-
-
-
-
- #include "NetLib.h"
- #include "storage.h"
- #include "Math.h"
- extern char buffer[256];
-
- /*isigma determines whether to take sigma of the inputs. No sigma seems to train faster*/
-
- /*#define isigma */
-
- amnesia(themind)
- mind *themind;
- {
- int i;
- int j;
-
- #define MRAND (((double) Random())/ 32767.0)
-
- for (i=0;i<themind->nhidden;i++)
- {
- for (j=0;j<themind->nin;j++)
- {
- themind->inweights[i][j]=MRAND;
- themind->inweightdeltas[i][j]=0.0;
- }
- themind->hiddenunits[i]=.5;
- themind->hiddendeltas[i]=0.0;
- themind->hiddenbias[i]=MRAND;
- themind->hiddenbiasdeltas[i]=0.0;
- }
- for (i=0;i<themind->nout;i++)
- {
- for (j=0;j<themind->nhidden;j++)
- {
- themind->hiddenweights[i][j]=MRAND;
- themind->hiddenweightdeltas[i][j]=0.0;
- }
- themind->outunits[i]=.5;
- themind->outdeltas[i]=0.0;
- themind->outbias[i]=MRAND;
- themind->outbiasdeltas[i]=0.0;
- }
- for (j=0;j<themind->nin;j++)
- {
- themind->inunits[j]=.5;
- themind->indeltas[j]=0.0;
- themind->inbias[j]=MRAND;
- themind->inbiasdeltas[j]=0.0;
- }
-
-
- }
-
- double sigma( x )
- double x;
- {
- return (1.0/(1.0+exp(-x)));
- }
-
-
-
- initmind(ni,nh,nout,lrate,moment,mymind)
- int ni,nh,nout;
- double lrate,moment;
- mind **mymind;
- {
- mind *themind;
- int i;
-
- themind= (mind *) mlalloc((long) sizeof(mind));
- themind->nin=ni;
- themind->nhidden=nh;
- themind->nout=nout;
- themind->learnrate=lrate;
- themind->momentum=moment;
- themind->inunits= (double *) mlalloc((long) (ni*sizeof(double)));
- themind->hiddenunits= (double *) mlalloc((long) (nh *sizeof(double)));
- themind->outunits= (double *) mlalloc((long) (nout * sizeof(double)));
- themind->inbias= (double *) mlalloc((long) (ni*sizeof(double)));
- themind->inbiasdeltas= (double *) mlalloc((long) (ni*sizeof(double)));
- themind->hiddenbias= (double *) mlalloc((long) (nh *sizeof(double)));
- themind->hiddenbiasdeltas= (double *) mlalloc((long) (nh *sizeof(double)));
- themind->outbias= (double *) mlalloc((long) (nout * sizeof(double)));
- themind->outbiasdeltas= (double *) mlalloc((long) (nout * sizeof(double)));
- themind->inweights= (double **) mlalloc((long) (nh * sizeof(double *)));
- for (i=0;i<nh;i++) themind->inweights[i]=(double *) mlalloc((long) (ni *sizeof(double)));
- themind->inweightdeltas= (double **) mlalloc((long) (nh * sizeof(double *)));
- for (i=0;i<nh;i++) themind->inweightdeltas[i]=(double *) mlalloc((long) (ni *sizeof(double)));
- themind->hiddenweights= (double **) mlalloc((long) (nout * sizeof(double *)));
- for (i=0;i<nout;i++) themind->hiddenweights[i]=(double *) mlalloc((long) (nh *sizeof(double)));
- themind->hiddenweightdeltas= (double **) mlalloc((long) (nout * sizeof(double *)));
- for (i=0;i<nout;i++) themind->hiddenweightdeltas[i]=(double *) mlalloc((long) (nh *sizeof(double)));
- themind->indeltas= (double *) mlalloc((long) (ni*sizeof(double)));
- themind->hiddendeltas= (double *) mlalloc((long) (nh *sizeof(double)));
- themind->outdeltas= (double *) mlalloc((long) (nout * sizeof(double)));
-
- amnesia(themind);
- themind->certfn=0L;
- *mymind=themind;
- }
-
- double learn(themind,inputs,outputs)
- mind *themind;
- double *inputs,*outputs;
- {
- int i,j,k;
- double a,tss=0.0,terror;
-
- think(themind,inputs);
- for(i=0;i<themind->nout;i++)
- {
- a=themind->outunits[i];
- terror=outputs[i]-a;
- tss += terror*terror;
- themind->outdeltas[i]=(terror)*a*(1.0-a);
- }
- for (i=0; i<themind->nhidden;i++)
- {
- a=themind->hiddenunits[i];
- themind->hiddendeltas[i]= 0.0;
- for (k=0; k< themind->nout; k++)
- {
- themind->hiddendeltas[i] += themind->outdeltas[k]*themind->hiddenweights[k][i];
- }
- themind->hiddendeltas[i] *= a*(1.0-a);
- }
- /* sprintf(buffer,"%g %g\r",themind->hiddendeltas[0],themind->hiddenweights[0][0]);
- CtoPstr(buffer);
- DisplayString(buffer);*/
- for (i=0; i< themind->nin; i++)
- {
- a=themind->inunits[i];
- themind->indeltas[i]=0.0;
- for (k=0;k<themind->nhidden;k++)
- {
- themind->indeltas[i] += themind->hiddendeltas[k] * themind -> inweights[k][i];
- }
- themind->indeltas[i] *= a*(1.0-a);
- }
-
- for (i=0; i< themind->nhidden; i++)
- {
- for (j=0; j< themind->nin; j++)
- {
- themind->inweightdeltas[i][j]= themind->learnrate* themind->hiddendeltas[i]*
- themind->inunits[j] + themind->momentum*themind->inweightdeltas[i][j];
- }
- themind->hiddenbiasdeltas[i] = themind->learnrate * themind->hiddendeltas[i] +
- themind->momentum*themind->hiddenbiasdeltas[i];
- }
- for (i=0; i < themind->nout; i++)
- {
- for (j=0;j< themind->nhidden;j++)
- {
- themind->hiddenweightdeltas[i][j]= themind->learnrate * themind->outdeltas[i]*
- themind->hiddenunits[j] + themind->momentum* themind->hiddenweightdeltas[i][j];
- }
- themind->outbiasdeltas[i] = themind->learnrate * themind->outdeltas[i] +
- themind->momentum*themind->outbiasdeltas[i];
- }
-
- for (i=0; i < themind->nin; i++)
- {
- themind->inbiasdeltas[i] = themind->learnrate * themind->indeltas[i] +
- themind->momentum*themind->inbiasdeltas[i];
- }
-
- reformmind(themind);
- return(tss);
-
- }
-
- think(themind,inputs)
- mind *themind;
- double *inputs;
- {
- int i,j,k,l;
-
- for (i=0;i<themind->nout;i++) themind->outunits[i]=themind->outbias[i];
- for (i=0;i<themind->nhidden;i++) themind->hiddenunits[i]=themind->hiddenbias[i];
- for (i=0;i<themind->nin;i++)
- {
- #ifdef isigma
- themind->inunits[i]= sigma( inputs[i]+themind->inbias[i] ) ;
- #else
- themind->inunits[i]= inputs[i]+themind->inbias[i] ;
- #endif
- for (j=0;j<themind->nhidden;j++)
- {
- themind->hiddenunits[j] +=themind->inunits[i]*themind->inweights[j][i];
- }
- }
-
-
- for (i=0;i<themind->nhidden;i++)
- {
- themind->hiddenunits[i] = sigma(themind->hiddenunits[i]);
- for (j=0;j<themind->nout;j++)
- {
- themind->outunits[j] +=themind->hiddenunits[i]*themind->hiddenweights[j][i];
- }
- }
-
- for (j=0;j< themind->nout;j++)
- {
-
- themind->outunits[j] = sigma(themind->outunits[j]);
- }
-
- }
-
- reformmind(themind)
- mind *themind;
- {
- int i;
- int j;
-
- for (i=0;i<themind->nhidden;i++)
- {
- for (j=0;j<themind->nin;j++)
- {
- themind->inweights[i][j] += themind->inweightdeltas[i][j];
- }
- themind->hiddenbias[i] += themind->hiddenbiasdeltas[i];
- }
-
- for (i=0;i<themind->nout;i++)
- {
- for (j=0;j<themind->nhidden;j++)
- {
- themind->hiddenweights[i][j] += themind->hiddenweightdeltas[i][j];
- }
- themind->outbias[i] += themind->outbiasdeltas[i];
- }
-
- for (j=0;j<themind->nin;j++)
- {
- themind->inbias[j] += themind->inbiasdeltas[j];
- }
-
-
- }
-