我有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)
答案 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)。