【问题标题】:LSTM. How to forecast multivariative time series?长短期记忆法。如何预测多元时间序列?
【发布时间】:2020-11-28 12:43:14
【问题描述】:

我正在尝试预测多元时间序列:

所以,这里有 4 个系列。

我尝试编写一个 LSTM 实现。一开始,我将我的数据框拆分为 TensorFlow 窗口数据集。因此,每个形状为 [12, 4] 的矩阵都可以预测下一个 [4] 值:

def get_windowed_dataset(df):
    ds = tf.data.Dataset.from_tensor_slices(df.values)
    ds = ds.window(13, shift=1, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(13))
    ds = ds.shuffle(1024)
    ds = ds.map(lambda w: (w[:-1], w[-1]))
    return ds

然后我创建了一个 LSTM 模型:

model = tf.keras.models.Sequential([
  tf.keras.layers.LSTM(16, return_sequences=True, input_shape=[None, 4]),
  tf.keras.layers.LSTM(16),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(8, activation="relu"),
  tf.keras.layers.Dense(4)
])

model.compile(loss=tf.keras.losses.Huber(),
              optimizer=tf.keras.optimizers.Adam(),
              metrics=["mae"])

但是当我打电话时

train_set = get_windowed_dataset(df)
model.fit(train_set, epochs=100)

引发错误:ValueError: Error when checking input: expected lstm_12_input to have 3 dimensions, but got array with shape (None, 4)

有什么问题?

编辑

感谢@Molessia,我发现需要对数据集进行批处理。所以,我的解决方案是:

def get_windowed_dataset(df):
    ds = data.Dataset.from_tensor_slices(df)
    ds = ds.window(13, shift=1, drop_remainder=True)
    ds = ds.flat_map(lambda w: w.batch(13))
    ds = ds.shuffle(1024)
    ds = ds.map(lambda w: (w[:-1], w[-1]))
    return ds.batch(32).prefetch(1)

【问题讨论】:

    标签: python tensorflow keras deep-learning lstm


    【解决方案1】:

    我认为这里的问题是 Keras 总是希望您分批提供输入数据,即使您选择批量大小为 1。这意味着您需要在输入中添加一个额外的维度才能使它是三维的,第一个维度是 batch_size。

    要解决这个问题,您可以像这样重塑输入数据集:

    data = data.reshape((1, 12, 4))
    

    【讨论】:

    • 您的回答帮助了我。虽然,pandas DataFrame 没有reshape 功能。我编辑了问题以显示我的解决方案
    猜你喜欢
    • 2018-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2020-08-24
    相关资源
    最近更新 更多