Synaptic JS LSTM占用太多内存

时间:2015-08-28 13:11:34

标签: javascript neural-network lstm

使用https://github.com/cazala/synaptic

我通过Architect尝试了LSTM模块,配置如下:

var LSTM = new synaptic.Architect.LSTM(100, 100, 20);

我的算法然后进行大约450到500次迭代,并且在每次迭代时它激活网络然后传播正确的输出值。

var output = LSTM.activate(HistoricalFrame);
//some code
LSTM.propagate(0.5, PredictionFrame);

经过400 - 500次迭代后,它突然停止并开始占用大约14GB的内存。在此单步之前,它使用大约1GB。

我不知道它是由跟踪还是优化引起的,但网络无法使用。

我已经测试了其余代码的内存泄漏,我发现问题是由激活功能引起的。

这是演示此问题的示例代码。在配备英特尔酷睿i5和8GB内存的MacBook Pro上,它在步骤512停止并开始占用高达14GB的内存。

var synaptic = require("synaptic");

//Define frames
var HistoricalFrame = [];
var PredictionFrame = [];

var HistoricalFrameSize = 100;
var PredictionFrameSize = 20;

var FrameCount = 25000;

//Create LSTM
console.log("Initializing LSTM...");
var LSTM = new synaptic.Architect.LSTM(HistoricalFrameSize, HistoricalFrameSize, PredictionFrameSize);

console.log("Optimizing LSTM...");
LSTM.optimize();

console.log("Starting prediction...");

//Make predictions
for(var FrameIndex = 0; FrameIndex < FrameCount; FrameIndex++){

    console.log(FrameIndex);

    //Add value to frame(s)
    PredictionFrame.push(Math.random());

    //Move first value from prediction frame to historical frame
    if(PredictionFrame.length > PredictionFrameSize){
        HistoricalFrame.push( PredictionFrame.shift() );
    }

    //Throw away first value from historical frame to keep the max size
    if(HistoricalFrame.length > HistoricalFrameSize)
        HistoricalFrame.shift();

    //Activate LSTM when frames are filled
    if(HistoricalFrame.length == HistoricalFrameSize){

        var output = LSTM.activate(HistoricalFrame);
        LSTM.propagate(0.5, PredictionFrame);

    }

}

任何有问题的想法都可以吗?

我还将此问题发布为问题https://github.com/cazala/synaptic/issues/56

我已经尝试过Python PyBrain库,它非常快,但它有不同的神经网络和LSTM实现。我需要通过论文来确切实施,因为它有最好的结果。

http://www.overcomplete.net/papers/nn2012.pdf

0 个答案:

没有答案