A code of mine that works well with different data types.
I like comments by programmers who like me are writing a feed forward neural network
with two hidden layers (arch: X-S-H-Y) using SAS.
%macro CalculateLayer;
/* Calculate S Layer */
%do i=1 %to &SLayer.; /* S Layer */
A=0;
%do j=1 %to &XLayer.; /* X Layer */
A + (ws&i.x&j. * x&j.);
%end;
A + ws&i.x&j.;
s&i. = 1.0 / (1.0 + exp(-A)); /* this is logit */
%end;
/* Calculate H Layer */
%do i=1 %to &HLayer.; /* H Layer */
A=0;
%do j=1 %to &SLayer.; /* S Layer */
A + (wh&i.s&j. * s&j.);
%end;
A + wh&i.s&j.;
h&i. = 1.0 / (1.0 + exp(-A));
%end;
/* Calculate Y Layer */
%do i=1 %to &YLayer.; /* Y Layer */
A=0;
%do j=1 %to &HLayer.; /* H Layer */
A + (wy&i.h&j. * h&j.);
%end;
A + wy&i.h&j.;
y&i. = 1.0 / (1.0 + exp(-A));
%end;
%mend;
%macro CalculateLayerError;
/* Calculate Y Layer Error */
%do i=1 %to &YLayer.; /* Y Layer */
Err=D&i. – y&i.;
DeltaY&i.=Err * y&i. * (1-y&i.);
%end;
/* Calculate H Layer Error */
%do i=1 %to &HLayer.; /* H Layer */
Err=0;
%do j=1 %to &YLayer.; /* Y Layer */
Err + (DeltaY&j. * wy&j.h&i.);
%end;
DeltaH&i.=Err * h&i. * (1-h&i.);
%end;
/* Calculate S Layer Error */
%do i=1 %to &SLayer.; /* S Layer */
Err=0;
%do j=1 %to &HLayer.; /* H Layer */
Err + (DeltaH&j. * wh&j.s&i.);
%end;
DeltaS&i.=Err * s&i. * (1-s&i.);
%end;
%mend;
%macro BackPropagation;
/* Modify Y Layer weights */
%do i=1 %to &YLayer.; /* Y Layer */
%do j=1 %to &HLayer.; /* H Layer */
wy&i.h&j. + (&Eps. * DeltaY&i. * H&j.);
%end;
wy&i.h&j. + (&Eps. * DeltaY&i.);
%end;
/* Modify H Layer weights */
%do i=1 %to &HLayer.; /* H Layer */
%do j=1 %to &SLayer.; /* S Layer */
wh&i.s&j. + (&Eps. * DeltaH&i. * s&j.);
%end;
wh&i.s&j. + (&Eps. * DeltaH&i.);
%end;
/* Modify S Layer weights */
%do i=1 %to &SLayer.; /* S Layer */
%do j=1 %to &XLayer.; /* X Layer */
ws&i.x&j. + (&Eps. * DeltaS&i. * x&j.);
%end;
ws&i.x&j. + (&Eps. * DeltaS&i.);
%end;
%mend;