You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 19:09:28