如何为时间序列预测建立Keras LSTM?

如何为时间序列预测建立Keras LSTM?,keras,lstm,Keras,Lstm,我有一个600个连续点(x(t),y(t))的训练批次,x(t)是25维向量,y(t)是我的目标(1维)。我想训练一个LSTM来预测在给定一些额外的x(t)[t>600]的情况下,该系列将如何继续。我尝试了以下模式: model = Sequential() model.add(LSTM(128, input_shape = (600,25), batch_size = 1, activation= 'tanh', return_sequences = True))

我有一个600个连续点(x(t),y(t))的训练批次,x(t)是25维向量,y(t)是我的目标(1维)。我想训练一个LSTM来预测在给定一些额外的x(t)[t>600]的情况下,该系列将如何继续。我尝试了以下模式:

    model = Sequential() 
    model.add(LSTM(128, input_shape = (600,25), batch_size = 1, activation= 'tanh', return_sequences = True)) 
    model.add(Dense(1, activation='linear'))
    model.compile(loss='mean_squared_error', optimizer='adam')
    model.fit(trainX, trainY, epochs=20 ,verbose=2) prediction

    prediction = model.predict(testX, batch_size = 1)
拟合效果很好,但我在预测步骤中不断得到以下错误:

    Error when checking : expected lstm_46_input to have shape (1, 600, 25) but got array with shape (1, 10, 25)
我错过了什么

以下是我的形状:

    trainX.shape = (1,600,25)
    trainY.shape = (1,600,1)
    testX.shape = (1,10,25)

根据Keras文档,LSTM(或任何RNN)层的输入应为形状
(批次大小、时间步长、输入尺寸)
,其中输入形状为

trainX.shape=(1600,25)

因此,这意味着对于培训,您只传递一个数据,每个时间步600个时间步,每个时间步25个特性。但我有一种感觉,你实际上有600个训练数据,每个数据都有25个时间步1个时间步。我猜您的输入形状(trainX)应该是
600x25x1
。列车目标(trainY)应为
600 x 1
如果我的假设正确,则您的测试数据应为
10 x 25 x 1
。第一个LSTM层应写为

    model.add(LSTM(128, input_shape = (25,1), batch_size = 1, activation= 'tanh', return_sequences = False)) 

如果您的培训数据实际上是(1600,25),这意味着您将LSTM反馈展开600次。第一个输入对第600个输入有影响。如果这是您想要的,您可以使用Keras函数“pad_sequences”向测试矩阵添加附加零,使其具有形状(1600,25)。网络应该预测零,您需要在testY中添加590个零

如果您只想说前10个时间步影响您当前的Y预测,那么您将希望将trainX变成形状(590,10,25)。输入行类似于:

model.add(LSTM(n_hid, stateful=True, return_sequences=False, batch_input_shape=(1,nTS,x_train.shape[2])))
以您想要的形式获取它的处理过程可能如下所示:

def formatTS(XX, yy, window_length):
x_train = np.zeros((XX.shape[0]-window_length,window_length,XX.shape[1]))
for i in range(x_train.shape[0]):
    x_train[i] = XX[i:i+window_length,:]
y_train = yy[window_length:]
return x_train, y_train

那么你的测试就可以正常工作了,因为它已经在形状(1,10,25)中了。

另外,如果y形状是正确的,他可能需要一个
TimeDistributed(densite(1))
,因为他每个时间步都有一个输出。对于2D输入,输入是(batch_size,input_size),input_shape=(25,1)意味着batch_size=25,而不是timesteps。