我未能在JS上训练神经网络

时间:2018-08-01 14:29:51

标签: javascript matrix neural-network backpropagation feed-forward

我是机器学习的新手,但是决定为神经网络创建自己的js库,在我尝试训练我的NN之前,一切都非常完美。在“我的迷你图书馆”中,我创建了一些功能...

1)创建我的神经元对象的函数:

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;
    }

此函数有一个参数,它是神经元所需的权重,它返回一个具有两个属性的对象-“ b”表示浮点数(偏差),“ w”表示包含浮点数的一维数组,其中一个方法-计算神经元对象的激活。

2)创建我的神经网络的功能

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;
    }

此函数返回一个以Neuron-Object作为最终值的2D数组,并使用参数数组作为每一层的层数和节点数的设置。

3)前馈神经网络的功能

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;
        }
    }

此函数返回2D数组,其中每个神经元的激活浮点数均为最终值。它使用2个变量-第二个函数的输出,输入数组。

4)和最终传播的最终功能

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;
        }
    }

此函数返回具有每个神经元的rror浮点数的2D数组作为最终值。参数为3-nnet,输入和所需的输出。

所以我可以建立一个神经网络,进行前向和反向传播,接收激活和错误,但是我总是无法通过错误和激活来训练我的网络,使其完美运行,上一次它为每种类型的输出相同的结果输入。我想从零开始理解训练算法,所以我需要别人的帮助。

P.S。 -我不想有人说我需要使用著名的图书馆,我想自己理解和制作它。

0 个答案:

没有答案