激活和培训2层深度网络

时间:2015-07-04 15:30:36

标签: javascript machine-learning artificial-intelligence neural-network deep-learning

总结:深度学习网络在激活时返回未定义的输出

我一直在使用synaptic.js在浏览器中制作神经网络一段时间我已经决定要为我正在进行的项目实现深度学习(将lstm连接到分类器)。

我已经成功创建了两个网络并且可以将lstm的输出投影到分类器的输入,但是当我尝试激活并且可能训练它时,我遇到了问题。

首先,它训练非常快(但是,授予,我正在用2个简单的输入进行训练,这可能不是问题)。但它训练出错误。我用一个输入训练它,因为它有一个输入神经元,然后每个类有5个输出。

现在当我激活它时,我没有收到错误,但我得到所有输出都是未定义的:[undefined, undefined, undefined, undefined, undefined]激活了[0],这是明确训练的。

我非常感谢让这个小型深度网络正常工作的任何帮助。每个网络都是单独工作的,但我相信一起训练都存在问题。如果我要分别训练它们 - 什么是lstm的理想输出和分类器的输入我会单独训练它们?

Here is synaptic: https://github.com/cazala/synaptic

Here is my implementation(Synaptic是顶部的大多数,我的代码位于底部。它可以在浏览器控制台中运行。使用deep.activate([0]);激活它。下面是我的实现 - 完整的synaptic.js在链接中。

function flstm(input, memoryBlocks, output, hidden, classes){
    var layerCount=Array.prototype.slice.call(arguments),
        previous=null,
        hiddenLayers=[],
        inputLSTM=new Layer(input),
        outputLSTM=new Layer(output),
        inputClassifier=new Layer(output),
        hiddenLayer=new Layer(hidden),
        outputClassifier=new Layer(classes);

        for(var layer in layerCount){
            var size=layerCount[layer], memoryCell=new Layer(size);
            var inputGate=new Layer(size).set({
                    bias:1
            });
            var forgetGate = new Layer(size).set({
                bias:1
            });
            var outputGate=new Layer(size).set({
                bias:1
            });
            hiddenLayers.push(inputGate);
            hiddenLayers.push(forgetGate);
            hiddenLayers.push(memoryCell);
            hiddenLayers.push(outputGate);

            //lstm's inputLayer connections
            var input=inputLSTM.project(memoryCell);
            inputLSTM.project(inputGate);
            inputLSTM.project(forgetGate);
            inputLSTM.project(outputGate);

            //previous memory-block's connections
            if(previous!==null){
                var cell=previous.project(memoryCell);
                previous.project(inputGate);
                previous.project(forgetGate);
                previous.project(outputGate);
            }

            //memory-cell's connections
            var output=memoryCell.project(outputLSTM);

            //recurrent-connection
            var self=memoryCell.project(memoryCell);
            //gates ( bill? )
            inputGate.gate(input, Layer.gateType.INPUT);
            forgetGate.gate(self, Layer.gateType.ONE_TO_ONE);
            outputGate.gate(output, Layer.gateType.OUTPUT);
            if(previous!==null) inputGate.gate(cell, Layer.gateType.INPUT);
            //peepholes ( call Tom )
            memoryCell.project(inputGate);
            memoryCell.project(forgetGate);
            memoryCell.project(outputGate);
            previous=memoryCell;
        }

        //lstm's input to lstm's output direct connection
        inputLSTM.project(outputLSTM);

        //classifier's connections
        inputClassifier.project(hiddenLayer);
        hiddenLayer.project(outputClassifier);

        //deep connections
        outputLSTM.project(inputClassifier);

        this.set({
            input: inputLSTM,
            hidden: hiddenLayers.concat([hiddenLayer]),
            output: outputClassifier
        });
}
flstm.prototype=new Network();
flstm.prototype.constructor=flstm;

var sa=new flstm(1, 16, 1, 8, 5);
var trainer=new Trainer(sa);
trainer.workerTrain([{input:[0], output:[1,0,0,0,0]}, {input:[1], output:[0,1,0,0,0]}], alert('done'));

先谢谢你

0 个答案:

没有答案