【问题标题】:Keras LSTM how to use a model that is many-to-many when trained for prediction that is one-to-many with stateful=True?Keras LSTM如何使用多对多的模型进行训练以进行有状态=真的一对多的预测?
【发布时间】:2018-12-03 01:43:33
【问题描述】:

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

感谢您的帮助

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

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

    一般来说,任何监督机器学习模型开发的经验法则是,您的训练阶段应该“类似于”您的测试阶段。例如,如果您想测试一对多架构,那么您也应该将其训练为一对多。

    编辑:

    阅读 cmets,您似乎想使用一个时间步的特征进行训练,看看它将如何在未来的时间步中执行。 (我认为这与时间序列数据的性质不一致,其中每个样本都对未来状态有贡献,如果一个样本可以很好地预测未来,那么这意味着下一个样本是无用的......但无论如何)。这是您如何做到这一点的方法。当然还有其他方法……

    拆分数据以进行训练和测试,类似于您在测试时间所做的事情。所以你的输入应该是形状 (None, 10) 和形状的输出 (None, 20, 5)。然后在您的输入中使用 Keras RepeatVector(例如 output = RepeatVector(20)(input),然后您应该得到一些形状 (None, 20, 10) 的东西,您现在可以通过模型的其余部分。

    【讨论】:

    • 谢谢你的回答萨塔。我有兴趣在测试时间进行一对多,因为我有兴趣了解模型如何在给定特定时间点的一组特征值的情况下执行细粒度的长期预测。想要一个顺序模型来做似乎是一件合理的事情。如何将 Keras LSTM 模型训练为一对多?
    猜你喜欢
    • 2019-06-24
    • 2021-12-15
    • 2021-06-13
    • 2017-12-30
    • 2017-07-16
    • 1970-01-01
    • 2019-10-14
    • 1970-01-01
    相关资源
    最近更新 更多