TensorFlow堆叠LSTM层出现输入维度不兼容报错该如何解决?
问题产生原因
- 核心错误是堆叠LSTM时前层输出维度不符合下一层输入要求:LSTM层默认要求输入为3维张量,维度顺序由
time_major参数决定,要么是(时间步, 批量大小, 特征数)要么是(批量大小, 时间步, 特征数)。你第一个LSTM层设置了return_sequences=False,该参数控制LSTM是否返回所有时间步的输出,设为False时仅返回最后一个时间步的结果,输出维度为2维(批量大小, 隐藏单元数),直接传给下一个LSTM就会触发维度不匹配的报错。 - 你修改第二个LSTM的
input_shape无效的原因:问题根源是上一层输出本身维度错误,和当前层的input_shape设置无关,修改该参数无法解决问题。 - 额外不符合需求的设置:你当前输入层设置为
Input(shape=(1,7)),直接把时间步固定为1,无法实现你支持任意长度时序输入的需求。
修正方案
要同时满足堆叠LSTM、支持任意长度时序、CuDNN加速三个要求,修改点如下:
- 所有位于中间的LSTM层(即除了最后一个LSTM之外的所有LSTM)都设置
return_sequences=True,保证输出为3维张量可传入下一层LSTM - 输入层修改为
Input(shape=(None,7)),第一个维度设为None即可支持任意长度的时序输入 - 你当前的其他参数(
activation、recurrent_activation、recurrent_dropout等)均符合CuDNN加速的约束,不需要调整
修正后的可运行代码:
import tensorflow as tf rnn = tf.keras.models.Sequential() # 支持任意时间步输入,time_major=True时输入shape(不含批量)为(时间步, 特征数) rnn.add(tf.keras.layers.Input(shape=(None, 7))) # 中间LSTM层return_sequences设为True,输出3维张量给下一层 rnn.add(tf.keras.layers.LSTM(5, activation="tanh", return_sequences=True, unroll=False, recurrent_activation='sigmoid', use_bias=True, time_major=True, recurrent_dropout=0, stateful=False)) # 最后一个LSTM按单值预测需求设return_sequences=False即可 rnn.add(tf.keras.layers.LSTM(5, activation="tanh", return_sequences=False, unroll=False, recurrent_activation='sigmoid', use_bias=True, time_major=True, recurrent_dropout=0, stateful=False)) rnn.add(tf.keras.layers.Dense(1, activation="linear"))
内容的提问来源于stack exchange,提问作者Mefitico
相关产品推荐
相关产品推荐

