dooooooduo

CI_ASS2_Neural Network Classification_PHP

Jan 3rd, 2017
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 16.04 KB | None | 0 0
  1. // Generating weights
  2. $layers_config = [2, 3, 1]; // nodes for each layer, excluding the hidden layer
  3. $layer_last    = count($layers_config) - 1;
  4. $weights       = [];
  5. $biases        = [];
  6. for ($layer = 1; $layer <= $layer_last; ++$layer) {
  7.     $prev_layer = $layer - 1;
  8.     $weights[$prev_layer] = [];
  9.     for ($node = 0; $node < $layers_config[$layer]; ++$node) {
  10.         for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
  11.             $weights[$prev_layer][$prev_node][$node] = generateWeight(); // weight from i to j
  12.         }
  13.         $biases[$layer][$node] = generateWeight(); // bias weight for each layer
  14.     }
  15. }
  16. //exit;
  17.  
  18. $learning_rate = .0001; // Initializing learning rate
  19.  
  20. echo '<pre>';
  21. //echo '<table width="100%">';
  22. print_r($weights);
  23. print_r($biases);
  24. $k = 0;
  25. for ($i = 1; $i < 9; ++$i) {
  26.     //echo '<tr><td><b>Training - iteration ' . $i . '</b></td></tr>';
  27.     //echo '<tr><td><b>Weight</b></td></tr>';
  28.  
  29.     $old_weights = $weights;
  30.     foreach ($training_sets as list($i0, $i1, $desired_output)) {
  31.  
  32.         // Forward activations
  33.         $outputs = [[$i0, $i1]];
  34.         for ($layer = 1; $layer <= $layer_last; ++$layer) {
  35.             $prev_layer = $layer - 1;
  36.             for ($node = 0; $node < $layers_config[$layer]; ++$node) {
  37.                 $sum = 0;
  38.                 for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
  39.                     $sum += $outputs[$prev_layer][$prev_node] * $weights[$prev_layer][$prev_node][$node];
  40.                 }
  41.                 $outputs[$layer][$node] = activate($sum + $biases[$layer][$node]);
  42.             }
  43.         }
  44.  
  45.         // Back propagations
  46.         //$error_total = pow($desired_output - $outputs[2][0], 2) / 2;
  47.         $error_gradients = [];
  48.         $prev_correction = [];
  49.         for ($layer = $layer_last; $layer > 0; --$layer) {
  50.             $next_layer = $layer + 1;
  51.             $prev_layer = $layer - 1;
  52.             for ($node = 0; $node < $layers_config[$layer]; ++$node) {
  53.                 $derivation = deriveActivation($outputs[$layer][$node]);
  54.                 if ($layer === $layer_last) {
  55.                     $error_gradients[$layer][$node] = $derivation * ($desired_output - $outputs[$layer][$node]);
  56.                 } else {
  57.                     $error_gradients[$layer][$node] = $biases[$layer][$node];
  58.                     for ($next_node = 0; $next_node < $layers_config[$next_layer]; ++$next_node) {
  59.                         $error_gradients[$layer][$node] += $error_gradients[$next_layer][$next_node] * $weights[$layer][$node][$next_node];
  60.                     }
  61.                     $error_gradients[$layer][$node] *= $derivation;
  62.                 }
  63.                 for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
  64.                     $weights[$prev_layer][$prev_node][$node] += $learning_rate * $outputs[$prev_layer][$prev_node] * $error_gradients[$layer][$node];
  65.                 }
  66.                 $biases[$layer][$node] += $learning_rate * -$error_gradients[$layer][$node];
  67.             }
  68.         }
  69.     }
  70.  
  71.     //echo '<tr><td>' . json_encode($weights) . '</td></tr>';
  72.     if (json_encode($old_weights) === json_encode($weights)) break;
  73. }
  74. //echo '</table>';
  75.  
  76. print_r($weights);
  77.  
  78. echo '<table>';
  79. echo '<tr><td colspan="3"><b>Solving</b></td></tr>';
  80. foreach ($sets as $k => list($i0, $i1, $desired_output)) {
  81.     $outputs = [[$i0, $i1]];
  82.     for ($layer = 1; $layer <= $layer_last; ++$layer) {
  83.         $prev_layer = $layer - 1;
  84.         for ($node = 0; $node < $layers_config[$layer]; ++$node) {
  85.             $sum = 0;
  86.             for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
  87.                 $sum += $outputs[$prev_layer][$prev_node] * $weights[$prev_layer][$prev_node][$node];
  88.             }
  89.             $outputs[$layer][$node] = activate($sum - $biases[$layer][$node]);
  90.         }
  91.     }
  92.     $outputs[2][0] = ($o = $outputs[2][0]) >= 0 ? 1 : -1;
  93.     echo '<tr><td>' . $o . '</td><td>' . $outputs[2][0] . '</td><td>' . $desired_output . '</td><td>' . ($outputs[2][0] == $desired_output ? '' : '×') . '</td></tr>';
  94. }
  95. echo '</table>';
Advertisement
Add Comment
Please, Sign In to add comment