如何对LSTM模型输出的指定维度取平均,将3维转为2维?
问题解答
完全可以通过对输出的时间步维度(也就是形状中的第二个维度,对应timesteps=20)取平均来完成降维,这种方式能把序列维度的信息整合起来,适配你的2维目标数据。下面给出两种具体实现方式:
方法一:使用GlobalAveragePooling1D层
这是Keras专门为序列数据降维设计的层,会自动对时间步维度计算平均值,代码修改如下:
batch_sizes = 1 epochs = 2 timesteps = 20 inputs_1_mae = tf.keras.layers.Input(shape=(20,10), batch_size=batch_sizes) lstm_1_mae = tf.keras.layers.LSTM(10, stateful=True, return_sequences=True)(inputs_1_mae) lstm_2_mae = tf.keras.layers.LSTM(10, stateful=True, return_sequences=True)(lstm_1_mae) output_1_mae = tf.keras.layers.Dense(units=10)(lstm_2_mae) # 新增全局平均池化层,对时间步维度(axis=1)取平均 avg_output = tf.keras.layers.GlobalAveragePooling1D()(output_1_mae) regressor_mae = tf.keras.Model(inputs=inputs_1_mae, outputs=avg_output) regressor_mae.compile(optimizer="adam", loss="mae") regressor_mae.summary() regressor_mae.fit(final_x_array, final_y_array, batch_size=batch_sizes, epochs=epochs)
修改后模型摘要里,GlobalAveragePooling1D层的输出形状会变成(1, 10),正好匹配你的目标数据维度。
方法二:使用Lambda层手动计算平均
如果需要更灵活的操作,可以用Lambda层结合tf.reduce_mean指定要降维的轴:
batch_sizes = 1 epochs = 2 timesteps = 20 inputs_1_mae = tf.keras.layers.Input(shape=(20,10), batch_size=batch_sizes) lstm_1_mae = tf.keras.layers.LSTM(10, stateful=True, return_sequences=True)(inputs_1_mae) lstm_2_mae = tf.keras.layers.LSTM(10, stateful=True, return_sequences=True)(lstm_1_mae) output_1_mae = tf.keras.layers.Dense(units=10)(lstm_2_mae) # 用Lambda层对axis=1(时间步维度)取平均 avg_output = tf.keras.layers.Lambda(lambda x: tf.reduce_mean(x, axis=1))(output_1_mae) regressor_mae = tf.keras.Model(inputs=inputs_1_mae, outputs=avg_output) regressor_mae.compile(optimizer="adam", loss="mae") regressor_mae.summary() regressor_mae.fit(final_x_array, final_y_array, batch_size=batch_sizes, epochs=epochs)
注意事项
- 确保目标数据
final_y_array的形状是(样本数, 10),和模型输出的(1,10)(单样本时)匹配,这样损失函数才能正常计算。 - 两种方法都不会影响LSTM的
stateful属性,训练时的状态管理不受影响。
内容的提问来源于stack exchange,提问作者Maagalam HARSHA VARDHAN
相关产品推荐
相关产品推荐

