首页 > 解决方案 > 用于时间序列预测的编码器解码器

问题描述

我想从 55 天的训练规模预测 7 天。我尝试应用此处此处给出的模型,但我将所有 7 天的输出值都设为 1。

我也对如何将时间序列作为编码器解码器的输入及其代码感到困惑,我根据自己的理解进行了尝试。

model.add(LSTM(150, input_shape=(None, 1)))
model.add(RepeatVector(8))
model.add(LSTM(150, return_sequences=True))
model.add(TimeDistributed(Dense(1, activation='softmax')))
model.compile(loss='mse', optimizer='adam')

for i in range(7):
    x=df[i*7:(i+1)*7]
    y=df[(i+1)*7:(i+2)*7]
    x=np.array(x)
    x=np.insert(x,0,len(x))
    x=x.reshape(1,len(x),1)
    y=np.array(y)
    y=np.insert(y,0,len(y))
    y=y.reshape(1,len(y),1)
    model.fit(x, y, epochs=1, verbose=2)

训练后,我从整个火车序列中预测 7 天。

第二我从链接2尝试

#functions define_models and predict_sequence same as link
for i in range(0,47):
    x1=df[i:i+7]
    print(len(x1))
    x2=df[i+1:i+8]
    print(len(x2))
    y=df[i+1:i+8]
    x1=np.array(x1)
    x1=np.insert(x1,0,len(x1))
    print(len(x1))
    x1=x1.reshape(len(x1),1,1)
    x2=np.array(x2)
    x2=np.insert(x2,0,0)
    print(len(x2))
    x2=x2.reshape(len(x2),1,1)
    y=np.array(y)
    y=np.insert(y,0,len(y))
    y=y.reshape(len(y),1,1)
    model.fit([x1,x2],y,epochs=1)

这也给出了 1 的输出。我不知道 x2 应该是什么。

请纠正我哪里错了。

标签: tensorflowtime-serieslstmrecurrent-neural-networkencoder-decoder

解决方案


第一个问题是,要训练深度网络,您应该执行以下步骤:

  1. 创建一个清晰的数据集。“清晰的数据集”是指tf.Dataset对象的一个​​实例。要创建tf.Dataset您的实例,应首先将数据集组织在具有形状(最大序列长度、批量大小、每条记录的大小)的 NumPy 数组中。在您的情况下,X包含训练数据的数组的大小应该是 (7, 1, 1),Y包含训练数据标签的数组应该是 (7,1)。
  2. 按照说明的格式组织好数据后,就可以创建一个tf.Dataset使用函数的实例了tf.Dataset.from_tensor_slices()
  3. 您应该使用model.fit()创建的tf.Dataset实例并指定大于 1 的合适时期数来使用该函数。该参数指定网络应在要训练的数据集上迭代的次数。此参数的值在某种程度上是任意的,但是,您应该尝试不同的值以达到最适合您的问题的值。

请注意,使用此过程您不再需要创建 for 循环。循环将在model.fit函数内部执行。

有关如何在 TensorFlow 中实现和训练编码器-解码器模型的更多信息,请查看神经机器翻译的官方示例。


推荐阅读