使用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。
我不知道它是由跟踪还是优化引起的,但是网络无法使用。
我已经测试了其余代码是否存在内存泄漏,我发现问题是由激活函数引起的。
这是演示此问题的示例代码。在我的配备 Intel Core i5 和 8GB RAM 的 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 实现。我需要通过以下论文进行精确实施,因为它有最好的结果。