我想在Keras中实现LSTM以便进行流时间序列预测-即在线运行,一次获取一个数据点。在这里对此进行了很好的解释,但是正如人们可能会假设的那样,在线LSTM的培训时间可能会非常缓慢。我想在迷你批次上训练我的网络,并在线测试(运行预测)。在Keras中执行此操作的最佳方法是什么?
例如,小批量可以是[33, 34, 42, 33, 32, 33, 36, ... 24, 23]
在连续的时间步长处出现的1000个数据值()的序列。为了训练网络,我指定了一个X
形状数组(900, 100, 1)
,其中有900个长度为100的序列和一个y
形状数组(900, 1)
。例如,
X[0] = [[33], [34], [42], [33], ...]]
X[1] = [[34], [42], [33], [32], ...]]
...
X[999] = [..., [24]]
y[999] = [23]
因此,对于每个序列X[i]
,都有一个对应的y[i]
代表时间序列中的下一个值,即我们要预测的值。
在测试中,我想预测下一个数据值1000到1999。我通过(1, 100, 1)
为1000到1999的每个步骤提供形状数组来进行预测,在该模型中,模型尝试预测下一个数据值。
这是针对我的问题的推荐方法和设置吗?启用有状态性可能是纯在线实施的一种方式,但是在Keras中,这需要一致batch_input_shape
的培训和测试,这对我的小批量培训然后在线测试的意图而言是行不通的。还是有办法可以做到这一点?
更新:尝试按照@nemo建议实施网络
我从博客文章“使用Keras用Python用LSTM递归神经网络进行时间序列预测”在示例网络上运行了自己的数据集,然后尝试将预测阶段实现为有状态网络。
两者的模型构建和培训是相同的:
# 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()
为了检查结果,以下图表以蓝色显示了实际(规范化)数据,以绿色显示了对训练集的预测,以红色显示了对测试集的预测。
第一个数字来自使用批处理预测,第二个数字来自有状态。有什么想法我做错了吗?
如果我对您的理解正确,那是在问您是否可以在训练后启用有状态性。这应该是可能的,是的。例如:
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)
之后,您可以以有状态的方式进行预测。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句