如何设置Keras LSTM进行时间序列预测?

时间:2017-06-27 22:20:47

标签: 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)) 
    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)

2 个答案:

答案 0 :(得分:5)

根据Keras文档,LSTM(或任何RNN)图层的输入应为(batch_size, timesteps, input_dim)形状,其输入形状为

  

trainX.shape =(1,600,25)

因此,对于训练而言,您只传递600个时间步长的一个数据和每个时间步长25个特征。但我觉得你实际上有 600个训练数据,每个 25次步骤,每个时间步长 1个功能。我想你的输入形状(trainX)应该是600 x 25 x 1。列车目标(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)) 

答案 1 :(得分:2)

如果您的训练数据实际上是(1,600,25),这意味着您将LSTM反馈展开600次。第一个输入对第600个输入有影响。如果这是您想要的,您可以使用Keras函数“pad_sequences”向测试矩阵添加附加零,使其具有形状(1,600,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)。