我正在学习如何在Keras中使用LSTM模型。我已经看过这个answer和这个answer,并希望以多对多的方式训练模型,但是在测试时,使用stateful = True的一对多进行预测方式。我不确定自己是否走对了。
我有一个由10,000个人组成的数据集,每个人都有20个时间步长和10个特征的序列。我想训练一个LSTM模型以预测下一个时间步长中的5个特征,使用90-10训练和测试拆分,我的train_x的形状为(9,000,20,10),而我的train_y的形状为(9,000,20,5 ),其中y中的值为下一个时间步中所选要素的值。我的test_x形状为(1,000,20,10)。在测试时,我想使用训练有素的模型在序列的最开始(时间步长0)仅使用10个特征进行预测。首先在接下来的时间步骤中预测所选5个特征的值。下一个时间步中其他5个特征的值是已知的,因此我想将它们与预测的5个特征结合起来,然后再次将其用作输入以预测下一个时间步中的5个特征,依此类推20步。
是否可以使用Keras库执行此操作?
我的培训代码如下
t_model = Sequential()
t_model.add(LSTM(100, return_sequence=True,
input_shape=(train_x.shape[1],
train_x.shape[2])))
t_model.add(TimeDistributed(Dense(5))
t_modle.compile(loss='mean_squared_error',
optimizer='adam')
checkpointer = ModelCheckpoint(filepath='weights.hdf5',
verbose=1,
save_best_only=True)
history = t_model.fit(train_x, train_y, epochs=50,
validation_split=0.1, callbacks=[checkpointer],
verbose=2, shuffle=False)
这似乎可以训练。请让我知道我在构建模型时是否有任何误解。
我的测试代码如下
p_model = Sequential()
p_model.add(LSTM(100, stateful=True,
return_sequences=True,
batch_input_shape=(1, 1,
test_x.shape[2])))
p_model.add(TimeDistributed(Dense(5)))
p_model.load_weights('weights.hdf5')
complete_yhat = np.empty([0, 5])
for i in range(len(test_x):
ind = test_x[i]
x = ind[0]
x = x.reshape(1, 1, x.shape[0])
for j in range(20):
yhat = p_model.predict(x)
complete_yhat = np.append(complete_yhat, yhat[0], axis=0)
if j < 19:
x = ind[j+1]
x = np.append([x[:-5]], yhat[0], axis=1)
x = x.reshape(1, x.shape[0], x.shape[1])
p_model.reset_states()
这没关系,但是我正在努力获得良好的预测准确性。有人可以让我知道我是否正确使用Keras LSTM吗?
谢谢您的帮助
答案 0 :(得分:0)
我不确定您是否真的可以训练具有多对多体系结构的模型,然后进行一对多测试。您也许可以破解某些东西并运行一段代码,但是从技术角度来看,这没有多大意义。您能解释一下为什么要在测试时间内进行一对多吗?
通常,任何受监督的机器学习模型开发的经验法则是,您的训练阶段应“类似于”测试阶段。例如,如果要测试一对多体系结构,则还应该将其训练为一对多。
编辑:
阅读评论,似乎您想从一个步骤开始进行功能培训,并查看它在以后的时间步中的性能。 (我认为这与时间序列数据的性质是矛盾的,在时间序列数据中,每个样本都对未来状态做出了贡献,如果一个样本可以很好地预测未来,则意味着下一个样本是无用的...但是无论如何)。这是您可以执行的操作。当然还有其他方法...
将数据拆分以进行培训和测试,类似于测试时间。因此您的输入应为形状(None,10),形状应为(None,20,5)。然后在输入中使用Keras RepeatVector(例如output = RepeatVector(20)(input)
,然后您应该获得形状(无,20、10)的形状,现在可以通过模型的其余部分进行传递了。