Keras Transformer编码器替换Conv1D为ConvLSTM1D的维度兼容问题
解决Keras中Transformer编码器替换Conv1D为ConvLSTM1D的维度不兼容问题
错误原因
ConvLSTM1D层要求输入是4维张量,格式为(batch_size, timesteps, spatial_dim, channels),而Transformer编码器输出的是3维张量(None, 24, 4)(即(batch, seq_len, features)),维度不匹配导致报错。
解决方案
需要在Transformer编码器的输出与ConvLSTM1D之间做维度转换:先将3维张量升为4维,供ConvLSTM1D处理;处理完成后再降回3维,保证能和残差连接的张量形状匹配。
修改后的Transformer编码器代码如下:
def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout=0): # Attention and Normalization x = layers.MultiHeadAttention( key_dim=head_size, num_heads=num_heads, dropout=dropout)(inputs, inputs) x = layers.Dropout(dropout)(x) x = layers.LayerNormalization(epsilon=1e-6)(x) res = x + inputs # Feed Forward Part(替换为ConvLSTM1D版本) # 将3维输入升为4维:(batch, seq_len, 1, features) x = layers.Reshape((inputs.shape[1], 1, inputs.shape[2]))(res) # ConvLSTM1D处理,必须设置return_sequences=True保留时间维度 x = layers.ConvLSTM1D(filters=ff_dim, kernel_size=1, activation="relu", return_sequences=True, dropout=dropout)(x) x = layers.Dropout(dropout)(x) # 用ConvLSTM1D还原特征维度 x = layers.ConvLSTM1D(filters=inputs.shape[-1], kernel_size=1, return_sequences=True)(x) # 降回3维,匹配res的维度 x = layers.Reshape((inputs.shape[1], inputs.shape[2]))(x) x = layers.LayerNormalization(epsilon=1e-6)(x) return x + res
关键注意点
- return_sequences=True:必须开启该参数,否则ConvLSTM1D会丢失时间维度,无法和残差连接的3维张量进行加法运算。
- 维度转换对应:升维和降维的操作要严格对应,确保最终输出的张量形状与输入
res完全一致,保证残差连接的有效性。 - 数据集输入适配:若你的数据集形状为
(1354,4,24,10),需先调整输入到Transformer编码器的张量为3维格式(比如根据你的时序逻辑,reshape为(1354, 4*24, 10)或(1354,24,4*10)),才能满足Transformer的输入要求。
内容的提问来源于stack exchange,提问作者Vladimir Dnepr
相关产品推荐
相关产品推荐

