dooooooduo

CI_ASS2_Neural Network Classification_C

Jan 2nd, 2017
183
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.94 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <math.h>
  5.  
  6. float learning_rate  = .001;
  7. int layers_config[3] = {2, 4, 1};
  8.  
  9. // from http://stackoverflow.com/a/686373
  10. float generateWeight (float min, float max) {
  11.     return .0005;
  12.     return min + ((float) rand()) / ((float) (RAND_MAX / (max - min)));
  13. }
  14.  
  15. float activate (float net) {
  16.     return tanh(net);
  17. }
  18.  
  19. float deriveActivation (float net) {
  20.     return 1.0 - pow(tanh(net), 2.0);
  21. }
  22.  
  23.  
  24. int main() {
  25.  
  26.     srand(time(NULL));
  27.  
  28.     float training_sets[1000][3];
  29.  
  30.     int layer, prev_layer, next_layer, node, prev_node, next_node;
  31.     int layer_last = sizeof(layers_config) / sizeof(int) - 1;
  32.     float weights[3][4][4];
  33.     float biases[3][4];
  34.     for (layer = 1; layer <= layer_last; ++layer) {
  35.         int prev_layer = layer - 1;
  36.         for (node = 0; node < layers_config[layer]; node++) {
  37.             for (prev_node = 0; prev_node < layers_config[prev_layer]; prev_node++) {
  38.                 weights[prev_layer][prev_node][node] = generateWeight(-.001, .001);
  39.             }
  40.             biases[layer][node] = generateWeight(-.001, .001);
  41.         }
  42.     }
  43.  
  44.     float p0, p1;
  45.     int count = 0;
  46.     while (1) {
  47.         char desired_out_str[2];
  48.         scanf("%f,%f,%s\n", &p0, &p1, desired_out_str);
  49.         if (p0 == 0 && p1 == 0 && desired_out_str[0] == '0') break;
  50.        
  51.         training_sets[count][0] = p0;
  52.         training_sets[count][1] = p1;
  53.         training_sets[count][2] = desired_out_str[0] == '+' ? 1 : -1;
  54.         count++;
  55.  
  56.     }
  57.  
  58.     // The training process starts
  59.     int i, j, desired_output;
  60.     for (i = 0; i < 1000; i++) {
  61.         for (j = 0; j < count; j++) {
  62.             desired_output = training_sets[j][2];
  63.  
  64.             // Forward activations
  65.             float outputs[3][4];
  66.             outputs[0][0] = training_sets[j][0];
  67.             outputs[0][1] = training_sets[j][1];
  68.             for (layer = 1; layer <= layer_last; layer++) {
  69.                 prev_layer = layer - 1;
  70.                 for (node = 0; node < layers_config[layer]; node++) {
  71.                     float sum = 0;
  72.                     for (prev_node = 0; prev_node < layers_config[prev_layer]; prev_node++) {
  73.                         sum += outputs[prev_layer][prev_node] * weights[prev_layer][prev_node][node];
  74.                     }
  75.                     outputs[layer][node] = activate(sum - biases[layer][node]);
  76.                 }
  77.             }
  78.  
  79.             // Back propagations
  80.             float error_gradients[3][4];
  81.             for (layer = layer_last; layer > 0; layer--) {
  82.                 next_layer = layer + 1;
  83.                 prev_layer = layer - 1;
  84.                 for (node = 0; node < layers_config[layer]; node++) {
  85.                     float derivation = deriveActivation(outputs[layer][node]);
  86.                     //printf("Current layer: %d/%d\n", layer, layer_last);
  87.                     if (layer == layer_last) {
  88.                         error_gradients[layer][node] = derivation * (desired_output - outputs[layer][node]);
  89.                         //printf("Error gradient in node %d, layer %d: %f\n", layer, node, derivation);
  90.                     } else {
  91.                         error_gradients[layer][node] = 0;
  92.                         for (next_node = 0; next_node < layers_config[next_layer]; next_node++) {
  93.                             error_gradients[layer][node] += error_gradients[next_layer][next_node] * weights[layer][node][next_node];
  94.                         }
  95.                         error_gradients[layer][node] *= derivation;
  96.                     }
  97.                     for (prev_node = 0; prev_node < layers_config[prev_layer]; prev_node++) {
  98.                         weights[prev_layer][prev_node][node] += learning_rate * outputs[prev_layer][prev_node] * error_gradients[layer][node];
  99.                     }
  100.                     biases[layer][node] += learning_rate * -error_gradients[layer][node];
  101.                 }
  102.             }
  103.         }
  104.     }
  105.  
  106.    
  107.     while (scanf("%f,%f\n", &p0, &p1) != EOF) {
  108.         float outputs[3][4];
  109.         outputs[0][0] = p0;
  110.         outputs[0][1] = p1;
  111.         for (layer = 1; layer <= layer_last; layer++) {
  112.             prev_layer = layer - 1;
  113.             for (node = 0; node < layers_config[layer]; node++) {
  114.                 float sum = 0;
  115.                 for (prev_node = 0; prev_node < layers_config[prev_layer]; prev_node++) {
  116.                     sum += outputs[prev_layer][prev_node] * weights[prev_layer][prev_node][node];
  117.                     //printf("Weights for layer %i, edge %i->%i: %f, output: %f, weight: %f\n", prev_layer, prev_node, node, weights[prev_layer][prev_node][node], outputs[prev_layer][prev_node], weights[prev_layer][prev_node][node]);
  118.                 }
  119.                 outputs[layer][node] = activate(sum - biases[layer][node]);
  120.             }
  121.         }
  122.         char* out_str = outputs[2][0] >= 0 ? "+1" : "-1";
  123.         printf("%s %f\n", out_str, outputs[2][0]);
  124.     }
  125.  
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment