多变量时间序列LSTM自编码器训练报错:形状不兼容问题求助
问题根源
你的错误完全是因为自编码器的目标数据形状和模型输出不匹配:
- 你的LSTM自编码器最后通过
TimeDistributed(Dense(4))输出的形状是(batch_size, 4, 4)(对应每个样本的4个时间步、每个时间步4个特征) - 但你传入的
y_train形状是(160573, 4),这是一个二维张量,两者无法计算MSE损失,所以报了形状不兼容的错误。
核心问题在于:自编码器的任务是重构输入本身,你不需要单独的y_train,应该把输入X_train同时作为训练的目标数据。
解决方案
你的模型结构其实已经适配多变量时间序列了——输入形状(timesteps, features)=(4,4),最后一层也正确用TimeDistributed(Dense(features))来输出每个时间步的多变量特征。只需要修改训练部分的目标数据即可:
修改后的完整代码
import keras # 模型结构无需改动,本身已支持多变量时间序列 model = keras.Sequential() model.add(keras.layers.LSTM( units=64, input_shape=(X_train.shape[1], X_train.shape[2]) )) model.add(keras.layers.Dropout(rate=0.2)) model.add(keras.layers.RepeatVector(n=X_train.shape[1])) model.add(keras.layers.LSTM(units=64, return_sequences=True)) model.add(keras.layers.Dropout(rate=0.2)) model.add( keras.layers.TimeDistributed( keras.layers.Dense(units=X_train.shape[2]) ) ) model.compile(loss='mse', optimizer='adam') # 关键修改:将训练目标替换为X_train,自编码器的核心是重构输入 training = model.fit( X_train, X_train, epochs=10, batch_size=64, validation_split=0.1, shuffle=False )
额外说明
如果你其实不是要做自编码器,而是想做多变量时间序列预测(比如用前4个时间步的特征,预测某个时间点的4个特征),那你的模型结构需要调整:
- 去掉
RepeatVector层 - 把第二个LSTM的
return_sequences设为False - 最后直接用
Dense(4)输出单时间步的4个特征 - 这时才能用
y_train作为目标数据,代码示例:
model = keras.Sequential() model.add(keras.layers.LSTM(units=64, input_shape=(X_train.shape[1], X_train.shape[2]))) model.add(keras.layers.Dropout(rate=0.2)) model.add(keras.layers.Dense(units=4)) model.compile(loss='mse', optimizer='adam') training = model.fit( X_train, y_train, epochs=10, batch_size=64, validation_split=0.1, shuffle=False )
但根据你提到的“LSTM自编码器”,第一种修改方案才是正确的适配方式。
内容的提问来源于stack exchange,提问作者MrReinsburg
相关产品推荐
相关产品推荐

