pybrain LSTM序列用于预测序列数据

时间:2014-08-22 05:07:46

标签: sequence prediction pybrain lstm

我使用pybrain编写了一个简单的代码来预测简单的顺序数据。 例如,0,1,2,3,4的序列将从网络获得5的输出。数据集指定剩余序列。 以下是我的代码实现

from pybrain.tools.shortcuts import buildNetwork
from pybrain.supervised.trainers import BackpropTrainer
from pybrain.datasets import SequentialDataSet
from pybrain.structure import SigmoidLayer, LinearLayer
from pybrain.structure import LSTMLayer

import itertools
import numpy as np

INPUTS = 5
OUTPUTS = 1
HIDDEN = 40

net = buildNetwork(INPUTS, HIDDEN, OUTPUTS, hiddenclass=LSTMLayer, outclass=LinearLayer, recurrent=True, bias=True) 

ds = SequentialDataSet(INPUTS, OUTPUTS)
ds.addSample([0,1,2,3,4],[5])
ds.addSample([5,6,7,8,9],[10])
ds.addSample([10,11,12,13,14],[15])
ds.addSample([16,17,18,19,20],[21])

net.randomize()

trainer = BackpropTrainer(net, ds)

for _ in range(1000):
    print trainer.train()

x=net.activate([0,1,2,3,4])
print x 

我的屏幕上的输出每次都会显示[0.99999999 0.99999999 0.9999999 0.99999999]。我错过了什么?训练不够吗?因为trainer.train()

显示输出86.625 ..

1 个答案:

答案 0 :(得分:2)

pybrain sigmoidLayer正在实现sigmoid压缩功能,你可以在这里看到:

sigmoid squashing function code

相关部分是:

def sigmoid(x):
""" Logistic sigmoid function. """
return 1. / (1. + safeExp(-x))

因此,无论x的值是多少,它都只会返回0到1之间的值。因此,对于其他人来说,最好将输入和输出值缩放到0到1之间。例如,将所有输入除以最大值(假设最小值不小于0),输出相同。然后用结果反过来(例如,如果你在开头除以25则乘以25)。

另外,我不是pybrain的专家,但我想知道你是否需要OUTPUTS = 4?看起来您的数据中只有一个输出,所以我想知道您是否可以使用OUTPUTS = 1.

您也可以尝试将输入和输出缩放到S形曲线的特定部分(例如介于0.1和0.9之间),以使pybrain的工作更容易,但这会使得缩放前后的缩放更复杂一些