2016-07-11 125 views
9

我想在Keras中实现LSTM以进行流式时间序列预测 - 即在线运行,每次只能获取一个数据点。 This is explained well here,但正如人们所假设的那样,在线LSTM的培训时间可能过于缓慢。我想在小批量上训练我的网络,并在线测试(运行预测)。在凯拉斯做这件事的最好方法是什么?LSTM与Keras进行小批量培训和在线测试

例如,小批量可以是在连续时间步骤发生的1000个数据值([33, 34, 42, 33, 32, 33, 36, ... 24, 23])的序列。为了训练网络,我已经指定了形状为(900, 100, 1)的数组X,其中有900个长度为100的序列和形状为(900, 1)的数组y。例如,

X[0] = [[33], [34], [42], [33], ...]] 
X[1] = [[34], [42], [33], [32], ...]] 
... 
X[999] = [..., [24]] 

y[999] = [23] 

所以每个序列X[i],有相应的y[i]表示在时间序列的下一个值 - 我们想预测。

在测试中,我想预测下一个数据值1000到1999.我通过为从1000到1999的每个步骤提供形状为(1, 100, 1)的数组来执行此操作,其中模型试图预测下一步的值。

这是我的问题推荐的方法和设置?启用状态性可能是纯粹在线实施的方式,但在Keras中,这需要一致的batch_input_shape进行培训和测试,这对于我的小批量培训和联机测试的意图不起作用。或者有什么办法可以做到这一点?

UPDATE:试图执行网络@nemo推荐

我跑和博客文章"Time Series Prediction with LSTM Recurrent Neural Networks in Python with Keras"一个例子网络上我自己的数据集,然后试图实现预测阶段有状态的网络。

模型建设和培训是两个相同的:

# Create and fit the LSTM network 
numberOfEpochs = 10 
look_back = 30 
model = Sequential() 
model.add(LSTM(4, input_dim=1, input_length=look_back)) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam') 
model.fit(trainX, trainY, nb_epoch=numberOfEpochs, batch_size=1, verbose=2) 
# trainX.shape = (6883, 30, 1) 
# trainY.shape = (6883,) 
# testX.shape = (3375, 30, 1) 
# testY.shape = (3375,) 

批量预测与完成:

trainPredict = model.predict(trainX, batch_size=batch_size) 
testPredict = model.predict(testX, batch_size=batch_size) 

尝试状态预测阶段,我跑了相同的模型设置和培训如前所述,但以下内容如下:

w = model.get_weights() 
batch_size = 1 
model = Sequential() 
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True)) 
model.add(Dense(1)) 
model.compile(loss='mean_squared_error', optimizer='adam') 
trainPredictions, testPredictions = [], [] 
for trainSample in trainX: 
    trainPredictions.append(model.predict(trainSample.reshape((1,look_back,1)), batch_size=batch_size)) 
trainPredict = numpy.concatenate(trainPredictions).ravel() 
for testSample in testX: 
    testPredictions.append(model.predict(testSample.reshape((1,look_back,1)), batch_size=batch_size)) 
testPredict = numpy.concatenate(testPredictions).ravel() 

要检查结果,下面的图显示以蓝色表示的实际(标准化)数据,以绿色表示的训练集预测以及以红色表示的测试集预测。

Results for batch prediction

Results from stateful prediction

第一个数字是从使用批处理预测,并且从有状态的第二个。任何想法我做错了吗?

+2

在培训和在线测试期间使用状态。训练期间,每次批次后重置状态。它也使事情变得更容易,因为你将所有的数据结构相同。 – runDOSrun

+1

对于任何想要了解keras中的有状态LSTM的人,这里有一个教程:http://philipperemy.github.io/keras-stateful-lstm/ –

回答

8

如果我正确理解你,你问你是否可以在培训后启用有状态。这应该是可能的,是的。例如:

net = Dense(1)(SimpleRNN(stateful=False)(input)) 
model = Model(input=input, output=net) 

model.fit(...) 

w = model.get_weights() 
net = Dense(1)(SimpleRNN(stateful=True)(input)) 
model = Model(input=input, output=net) 
model.set_weights(w) 

之后,您可以以有状态的方式进行预测。

+0

谢谢。我试过实现这个,但仍然有一些问题。请参阅编辑的问题。我非常感谢你的帮助! – BoltzmannBrain

+2

有两件事:你永远不会重置你的经常层的状态,数据看起来非常相似,但缩放比例不同;例如,它可能是一个简单的缩放问题。在任何情况下,这个问题都不适合SO了。这可能是最好的做你自己的测试,沸腾的东西下来,制定更短的问题:) – nemo