多特征多输出LSTM时间序列预测输出维度不符如何调整
问题原因
LSTM层的return_sequences参数设为True时,会返回所有时间步的隐藏状态输出,输出维度会保留时间步长维度。你当前三层LSTM都开启了return_sequences=True,到最后的全连接层时输入维度为(样本数, 30, 50),全连接层会对每个时间步单独做映射,最终输出就会多出30的时间维度,和需求不符。
调整方案
你可以任选以下两种方案修改:
方案1:关闭最后一层LSTM的return_sequences
这是多对一时间序列预测的标准写法,仅让最后一层LSTM返回最后一个时间步的隐藏状态,直接去掉时间维度:
model = Sequential() model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.2)) model.add(LSTM(units = 50, return_sequences = True)) model.add(Dropout(0.2)) # 最后一层LSTM不设置return_sequences,默认值为False model.add(LSTM(units = 50)) model.add(Dropout(0.2)) model.add(Dense(units = 4))
修改后输出维度为(样本数, 4),完全匹配你的预期。
方案2:新增时间维度聚合层
如果你需要保留所有时间步的输出做特征融合,可以在最后一层LSTM之后新增全局池化层,聚合30个时间步的特征后再接全连接层:
from tensorflow.keras.layers import GlobalAveragePooling1D model = Sequential() model.add(LSTM(units = 50, return_sequences = True, input_shape = (X_train.shape[1], X_train.shape[2]))) model.add(Dropout(0.2)) model.add(LSTM(units = 50, return_sequences = True)) model.add(Dropout(0.2)) model.add(LSTM(units = 50, return_sequences = True)) model.add(Dropout(0.2)) # 全局平均池化层聚合所有时间步的特征 model.add(GlobalAveragePooling1D()) model.add(Dense(units = 4))
这种方案适合多时间步均包含有效预测信息的场景,你可以根据实际测试精度选择更适配的方案。
内容的提问来源于stack exchange,提问作者Patrick Bro
相关产品推荐
相关产品推荐

