ValueError: lstm层输入不兼容,期望ndim=3收到4维,该如何解决?
报错根因
LSTM、GRU这类循环神经网络层默认要求输入张量为3维结构,格式为(批量大小, 时间步长, 特征数),你触发错误的核心原因是对Keras输入形状参数的规则理解有误:
Keras中input_shape参数的定义不包含批量维度,当你给首层传入input_shape=(BATCH_SIZE, N_PAST, N_FEATURES)时,Keras会自动在形状最前面补充批量维度,最终模型期望的输入维度变成了4维(None, BATCH_SIZE, N_PAST, N_FEATURES),和你实际输入的3维数据不匹配,因此抛出维度不兼容的报错。
解决方案
如果你必须固定首层输入的完整形状(包含批量大小),只需要将input_shape参数替换为batch_input_shape即可,该参数支持传入包含批量维度的完整输入形状:
model = tf.keras.models.Sequential([ # 替换input_shape为batch_input_shape tf.keras.layers.LSTM(64, return_sequences=True, batch_input_shape=(BATCH_SIZE, N_PAST, N_FEATURES)), tf.keras.layers.Dense(N_FEATURES) ]) model.summary() optimizer = tf.keras.optimizers.SGD(lr=1e-8, momentum=0.9) model.compile( loss="mse", optimizer=optimizer, metrics=["mae"] ) model.fit( train_set, validation_data=valid_set,validation_steps=100, epochs=100 )
注意:使用固定的
batch_input_shape后,你传入的训练集、验证集每个批次的样本量必须严格等于BATCH_SIZE,后续做模型预测时输入数据的批次大小也需要和该值保持一致,否则仍会触发维度错误。
如果后续不需要严格限制批量大小,也可以直接去掉input_shape中的批量维度,写成input_shape=(N_PAST, N_FEATURES)即可适配任意批量大小的输入。
内容的提问来源于stack exchange,提问作者WeiJie
相关产品推荐
相关产品推荐

