Keras LSTM如何在训练有状态= True的一对多预测时使用多对多模型?

时间:2018-12-03 01:43:34

标签: python tensorflow keras

我正在学习如何在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吗?

谢谢您的帮助

1 个答案:

答案 0 :(得分:0)

我不确定您是否真的可以训练具有多对多体系结构的模型,然后进行一对多测试。您也许可以破解某些东西并运行一段代码,但是从技术角度来看,这没有多大意义。您能解释一下为什么要在测试时间内进行一对多吗?

通常,任何受监督的机器学习模型开发的经验法则是,您的训练阶段应“类似于”测试阶段。例如,如果要测试一对多体系结构,则还应该将其训练为一对多。

编辑:

阅读评论,似乎您想从一个步骤开始进行功能培训,并查看它在以后的时间步中的性能。 (我认为这与时间序列数据的性质是矛盾的,在时间序列数据中,每个样本都对未来状态做出了贡献,如果一个样本可以很好地预测未来,则意味着下一个样本是无用的...但是无论如何)。这是您可以执行的操作。当然还有其他方法...

将数据拆分以进行培训和测试,类似于测试时间。因此您的输入应为形状(None,10),形状应为(None,20,5)。然后在输入中使用Keras RepeatVector(例如output = RepeatVector(20)(input),然后您应该获得形状(无,20、10)的形状,现在可以通过模型的其余部分进行传递了。