多对多LSTM实现出现ValueError输入维度不匹配问题求助
报错原因
Keras中所有RNN类层(包括LSTM)要求输入必须为3维张量,格式为(样本总数, 时间步长, 单时间步特征数)。
你当前定义的模型输入格式input_shape=(2,2)表示单样本维度为(时间步长=2, 特征数=2),对应整体输入的维度应为(N,2,2),其中N为样本数。但你实际构造的X数组维度为(2,2),仅2维,维度不匹配触发报错。
解决方案
根据你的多对多LSTM使用场景,需要调整输入输出的维度,以下是可直接运行的修改方案:
- 给输入X增加样本维度,调整为符合要求的3维结构
- 同步给输出Y增加维度,匹配
TimeDistributed层的3维输出要求 - 修正模型的
input_shape参数匹配实际数据结构
修改后的完整代码如下:
import numpy as np from tensorflow.keras.models import Sequential from tensorflow.keras.layers import LSTM, Dropout, TimeDistributed, Dense, Activation # 输入数据:2个样本,单样本包含1个时间步,每个时间步2个特征 X = np.array(((10,20), (20,30))) # 扩展为3维:(2个样本, 1个时间步, 2个特征) X = np.expand_dims(X, axis=1) # 输出数据:2个样本,单样本对应1个时间步的3个输出值 Y = np.array(( (3.43766, -0.0258654, -9.33203), (3.39076, 0.0415078, -9.29935) )) # 扩展为3维匹配输出要求:(2个样本, 1个时间步, 3个输出值) Y = np.expand_dims(Y, axis=1) model = Sequential() # 修正input_shape为(时间步=1, 特征数=2) model.add(LSTM(input_shape=(1,2), return_sequences=True, units=50)) model.add(Dropout(0.2)) model.add(LSTM(250, return_sequences=True)) model.add(Dropout(0.2)) model.add(TimeDistributed(Dense(3))) model.add(Activation("linear")) model.compile(loss="mse", optimizer="rmsprop") model.fit(X, Y, epochs=1000, batch_size=1, verbose=2)
如果你后续需要处理更长的连续时间序列,只需调整input_shape里的时间步参数,同时将输入输出的数据按照(样本数, 时间步长, 特征数/输出数)的格式构造即可。
内容的提问来源于stack exchange,提问作者Abhishek Patil
相关产品推荐
相关产品推荐

