我一直在研究用于时间序列预测的多元 LSTM 模型,但遇到了一个问题,即预测输出没有表现出足够的可变性或“起伏”。预测往往过于平滑或平坦,尤其是在第一个预测点之后。以下是我的模型架构的简要概述:
model.add(tf.keras.layers.InputLayer(input_shape=(60,25)))
model.add(LSTM(256,return_sequences=True))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(LSTM(256,return_sequences=True))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(LSTM(256,return_sequences=False))
model.add(tf.keras.layers.LayerNormalization())
model.add(Dropout(0.2))
model.add(Dense(30 * 3,activation=tf.keras.layers.LeakyReLU(alpha=0.1))
model.add(Reshape([30, 3]))
我想要实现的是让输出层预测 90 个点,这将进一步重塑为三个变量。关于数据:
我的问题是:我是否正确处理了 LSTM 的最后一层?我的目标是一次性预测 3 个特征的 30 个值。
我尝试过的:
LSTM 文档链接 https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM
输出激活功能: 首先,对我来说最引人注目的一个(@DrSnoopy 的评论中也已经提到) - 确保输出激活函数适合您的回归任务。由于您要预测连续值,因此使用线性激活通常是一个不错的选择。
model.add(Dense(30 * 3, activation='linear'))
损失函数: 确认您的损失函数适合回归。均方误差 (MSE) 通常用于回归任务。你没有提到你正在使用什么,但这确实是一个重要的选择。
model.compile(loss='mean_squared_error', optimizer=optimizer)
标准化/缩放: 你说你正在尝试进行一些正常化。 a) 确保在训练和推理过程中一致应用缩放。 b) 标准化过程应基于仅根据训练集计算的统计数据。这绝对是您应该始终执行的操作,因为它很容易执行,并且可以帮助您的模型更快、更稳定地收敛。
模型复杂度: 考虑您的模型是否足够复杂以捕获数据中的基础模式。如果预测过于平滑,则可能表明模型无法捕获数据中的变异性。 #添加图层。
或者..
序列长度: 试验输入序列的长度(在您的例子中为 60)。您可以尝试减少它,看看它是否对模型捕获模式的能力有影响(同时保持容量/单位数量不变)。