I Failed To Train Neural Network On JS

41 Views Asked by At

I am newbie in machine learning, but decided to make own js library for neural networks, everything went perfect until i tryed to train my NN. In My Mini Library i created some functions...

1) A Function That Creates My Neuron-Object:

this.Node = function (conns) {
        var output = {};
        output.b = hyth.Random({type: "TanH"});
        output.w = [];

        for (var a = 0; a < conns; a++){
            output.w[a] = hyth.Random({type: "TanH"});
        }

        output.Value = function (i) {
            if (i.length == conns) {
                var sum = 0;
                for (var a = 0; a < conns; a++){
                    sum += i[a] * output.w[a];
                }
                sum += output.b;
                return myMath.Activate(sum, {type: "Sigmoid"});
            }
        }

        return output;
    }

This function has one argument , which is the amount of wanted weights from neuron, and it returns an object with two properties - "b" the float (bias), and "w" the 1D Array which contains floats, and one method - which calculates the activation of neuron-object.

2) A Function That Creates My Neural Net

this.Network = function () {
        var p = arguments;
        var arr = [];
        for (var a = 0; a < p.length-1; a++){
            arr[a] = [];
            for (var b = 0; b < p[a+1]; b++){
                arr[a][b] = this.Node(p[a]);
            }
        }

        return arr;
    }

This Function Returns A 2D Array with Neuron-Object as It's final value, using argument array as settings for layer count and node count for each layer.

3) A Function That Feeds Forward The NN

this.Forward = function (network, input) {
        if (network[0][0].w.length == input.length) {
            var activations = [];

            for (var a = 0; a < network.length; a++){
                activations[a] = [];
                for (var c = 0; c < network[a].length; c++){
                    if (a == 0){
                        activations[0][c] = network[0][c].Value(input);
                        continue;
                    }
                    activations[a][c] = network[a][c].Value(activations[a-1]);
                }
            }

            return activations;
        }
    }

This Function Returns 2D array with an activation float for every neuron as it's final value. It uses 2 agruments - the output of 2nd function, input array.

4) And Final Function That Backpropagates

this.Backward = function (network, input, target) {
        if (network[0][0].w.length == input.length && network[network.length-1].length == target.length) {
            var activations = this.Forward(network, input, true);
            var predictions = activations[activations.length-1];

            var errors = [];

            for (var v = 0; v < network.length; v++) {
                errors[v] = [];
            }

            for (var a = network.length-1; a > -1; a--){
                for (var x = 0; x < network[a].length; x++) {
                    var deract = hyth.Deractivate(activations[a][x]);
                    if (a == network.length-1) {
                        errors[a][x] = (predictions[x] - target[x]) * deract;
                    } else {
                        errors[a][x] = 0;
                        for (var y = 0; y < network[a+1].length; y++) {
                            errors[a][x] += network[a+1][y].w[x] * errors[a+1][y];
                        }
                        errors[a][x] *= deract;
                    }
                }
            }

            return errors;
        }
    }

This Function Returns 2D array with the rror float for every neuron as it's final value. Arguments are 3 - the nnet , input and wanted output.

So I can make a neural network, feed forward and and backpropagate, receive activations and errors, but i always fail to train my net with my errors and activations to work perfect , last time it was outputing same result for every type of input. I want to understand training algorithm from zero , so i need someone's help.

P.S. - i dont want someone say that i need to use famous libraries , i want to understand and make it myself.

0

There are 0 best solutions below