Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Generating weights
- $layers_config = [2, 3, 1]; // nodes for each layer, excluding the hidden layer
- $layer_last = count($layers_config) - 1;
- $weights = [];
- $biases = [];
- for ($layer = 1; $layer <= $layer_last; ++$layer) {
- $prev_layer = $layer - 1;
- $weights[$prev_layer] = [];
- for ($node = 0; $node < $layers_config[$layer]; ++$node) {
- for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
- $weights[$prev_layer][$prev_node][$node] = generateWeight(); // weight from i to j
- }
- $biases[$layer][$node] = generateWeight(); // bias weight for each layer
- }
- }
- //exit;
- $learning_rate = .0001; // Initializing learning rate
- echo '<pre>';
- //echo '<table width="100%">';
- print_r($weights);
- print_r($biases);
- $k = 0;
- for ($i = 1; $i < 9; ++$i) {
- //echo '<tr><td><b>Training - iteration ' . $i . '</b></td></tr>';
- //echo '<tr><td><b>Weight</b></td></tr>';
- $old_weights = $weights;
- foreach ($training_sets as list($i0, $i1, $desired_output)) {
- // Forward activations
- $outputs = [[$i0, $i1]];
- for ($layer = 1; $layer <= $layer_last; ++$layer) {
- $prev_layer = $layer - 1;
- for ($node = 0; $node < $layers_config[$layer]; ++$node) {
- $sum = 0;
- for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
- $sum += $outputs[$prev_layer][$prev_node] * $weights[$prev_layer][$prev_node][$node];
- }
- $outputs[$layer][$node] = activate($sum + $biases[$layer][$node]);
- }
- }
- // Back propagations
- //$error_total = pow($desired_output - $outputs[2][0], 2) / 2;
- $error_gradients = [];
- $prev_correction = [];
- for ($layer = $layer_last; $layer > 0; --$layer) {
- $next_layer = $layer + 1;
- $prev_layer = $layer - 1;
- for ($node = 0; $node < $layers_config[$layer]; ++$node) {
- $derivation = deriveActivation($outputs[$layer][$node]);
- if ($layer === $layer_last) {
- $error_gradients[$layer][$node] = $derivation * ($desired_output - $outputs[$layer][$node]);
- } else {
- $error_gradients[$layer][$node] = $biases[$layer][$node];
- for ($next_node = 0; $next_node < $layers_config[$next_layer]; ++$next_node) {
- $error_gradients[$layer][$node] += $error_gradients[$next_layer][$next_node] * $weights[$layer][$node][$next_node];
- }
- $error_gradients[$layer][$node] *= $derivation;
- }
- for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
- $weights[$prev_layer][$prev_node][$node] += $learning_rate * $outputs[$prev_layer][$prev_node] * $error_gradients[$layer][$node];
- }
- $biases[$layer][$node] += $learning_rate * -$error_gradients[$layer][$node];
- }
- }
- }
- //echo '<tr><td>' . json_encode($weights) . '</td></tr>';
- if (json_encode($old_weights) === json_encode($weights)) break;
- }
- //echo '</table>';
- print_r($weights);
- echo '<table>';
- echo '<tr><td colspan="3"><b>Solving</b></td></tr>';
- foreach ($sets as $k => list($i0, $i1, $desired_output)) {
- $outputs = [[$i0, $i1]];
- for ($layer = 1; $layer <= $layer_last; ++$layer) {
- $prev_layer = $layer - 1;
- for ($node = 0; $node < $layers_config[$layer]; ++$node) {
- $sum = 0;
- for ($prev_node = 0; $prev_node < $layers_config[$prev_layer]; ++$prev_node) {
- $sum += $outputs[$prev_layer][$prev_node] * $weights[$prev_layer][$prev_node][$node];
- }
- $outputs[$layer][$node] = activate($sum - $biases[$layer][$node]);
- }
- }
- $outputs[2][0] = ($o = $outputs[2][0]) >= 0 ? 1 : -1;
- echo '<tr><td>' . $o . '</td><td>' . $outputs[2][0] . '</td><td>' . $desired_output . '</td><td>' . ($outputs[2][0] == $desired_output ? '' : '×') . '</td></tr>';
- }
- echo '</table>';
Advertisement
Add Comment
Please, Sign In to add comment