如何让LSTM模型predict(x_test)输出二维数组?
解决LSTM模型predict输出三维数组的问题
问题根源
你的LSTM模型中所有LSTM层都设置了return_sequences=True,这会让每个LSTM层输出包含时间步维度的三维张量(形状为(样本数, 时间步, 特征数))。后续的Dense层默认对最后一维(特征数)做运算,会保留时间步维度,最终导致预测输出为三维数组。
解决方案
将最后一个LSTM层的return_sequences=True改为return_sequences=False,让该层输出仅包含样本和特征维度的二维张量,后续Dense层处理后即可得到二维的预测结果(形状为(103, 1))。
修改后的代码
# model create model = Sequential() # 第一个LSTM保留return_sequences=True,为下一层LSTM传递序列信息 model.add(LSTM(7, return_sequences=True, input_shape=(x_train.shape[1], 1))) # 最后一个LSTM关闭return_sequences,丢弃时间步维度 model.add(LSTM(10, return_sequences=False)) model.add(Dense(25, activation='relu')) model.add(Dense(90, activation='relu')) model.add(Dense(25, activation='relu')) model.add(Dense(1)) # Compile the model model.compile(optimizer='adam', loss='mean_squared_error', metrics=['accuracy','mae']) # Predict prediction = model.predict(x_test) print(prediction.shape) # 输出应为(103, 1)
备选方案(不推荐)
如果必须保留LSTM的序列输出再接Dense层,可以在最后一个Dense前添加Flatten()层展平时间步和特征维度,但这种方式会丢失时序上下文关联,仅适用于特殊场景:
model = Sequential() model.add(LSTM(7, return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(LSTM(10, return_sequences=True)) model.add(Flatten()) # 展平为(样本数, 7*10) model.add(Dense(25, activation='relu')) model.add(Dense(90, activation='relu')) model.add(Dense(25, activation='relu')) model.add(Dense(1))
内容的提问来源于stack exchange,提问作者seongmin
相关产品推荐
相关产品推荐

