【发布时间】: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