blob: 0dce65ad4e79f5220df8a28389d0c9558b927a13 [file] [log] [blame]
/*
******************************************************************
* HISTORY
* 15-Oct-94 Jeff Shufelt (js), Carnegie Mellon University
* Prepared for 15-681, Fall 1994.
* Modified by Shuai Che
* 28-May-2018: Modified by Pankaj Kukreja,
* Indian Institute of Technology Hyderabad, India
******************************************************************
*/
#include "backprop.h"
#include <math.h>
#include <stdio.h>
float bpnn_train_kernel(
int in, int hid, int out, float input_units[static const restrict in + 1],
float hidden_units[static const restrict hid + 1],
float output_units[static const restrict out + 1],
float hidden_delta[static const restrict hid + 1],
float output_delta[static const restrict out + 1],
float target[static const restrict out + 1],
float input_weights[static const restrict in + 1][1 + hid],
float hidden_weights[static const restrict hid + 1][out + 1],
float input_prev_weights[static const restrict in + 1][hid + 1],
float hidden_prev_weights[static const restrict hid + 1][out + 1],
int iterations) {
float output_error = 0.0;
for (int iteration = 0; iteration < iterations; iteration++) {
double sum;
int j, k;
input_units[0] = 1.0;
for (j = 1; j <= hid; j++) {
sum = 0.0;
for (k = 0; k <= in; k++) {
sum += input_weights[k][j] * input_units[k];
}
hidden_units[j] = (1.0 / (1.0 + exp(-1 * sum)));
}
hidden_units[0] = 1.0;
for (j = 1; j <= out; j++) {
sum = 0.0;
for (k = 0; k <= hid; k++) {
sum += hidden_weights[k][j] * hidden_units[k];
}
output_units[j] = (1.0 / (1.0 + exp(-sum)));
}
float o, t;
output_error = 0.0;
for (j = 1; j <= out; j++) {
o = output_units[j];
t = target[j];
output_delta[j] = o * (1.0 - o) * (t - o);
output_error += fabs(output_delta[j]);
}
float new_dw;
hidden_units[0] = 1.0;
for (j = 1; j <= out; j++) {
for (k = 0; k <= hid; k++) {
new_dw = ((ETA * output_delta[j] * hidden_units[k]) +
(MOMENTUM * hidden_prev_weights[k][j]));
hidden_weights[k][j] += new_dw;
hidden_prev_weights[k][j] = new_dw;
}
}
input_units[0] = 1.0;
for (j = 1; j <= hid; j++) {
for (k = 0; k <= in; k++) {
new_dw = ((ETA * hidden_delta[j] * input_units[k]) +
(MOMENTUM * input_prev_weights[k][j]));
input_weights[k][j] += new_dw;
input_prev_weights[k][j] = new_dw;
}
}
}
return (output_error);
printf("%f\n", output_error);
}