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

Keras MultiHeadAttention报错求助:维度值类型不符问题

问题排查与修正代码

先列几个核心错误点:

  • MultiHeadAttention参数错误:value_dim需要传入整数特征维度,不能直接传Bdir_layer2.shape(这是TensorShape对象),而且key_dim要和query的最后一维匹配。
  • 输入分支错误:你把QUERY_train(训练数据)直接传给函数,应该传query的形状;模型需要两个输入分支(时序数据X和查询向量QUERY),但当前代码只定义了一个输入x。
  • 注意力层调用方式错误:MultiHeadAttention的调用格式是attn_layer(query, value),不是链式调用的写法。
  • 张量形状不匹配:query的形状应该是(batch_size, query_seq_len, query_dim),你的QUERY_train是(22500,5),需要扩展维度变成(22500,1,5)才能和LSTM输出的(22500,6,8)做注意力计算。

接下来是修正后的完整代码:

import tensorflow as tf
from tensorflow.keras import layers, Model, optimizers, losses

def create_RNN_with_attention(input_shape, query_shape):
    # 两个输入分支:时序数据 + 查询向量
    x = tf.keras.Input(shape=input_shape)  # 形状(6,3)
    query_input = tf.keras.Input(shape=query_shape)  # 形状(5,)
    
    # 双向LSTM层
    Bdir_layer = layers.Bidirectional(layers.LSTM(4, return_sequences=True, activation="tanh"))(x)
    Bdir_layer2 = layers.Bidirectional(layers.LSTM(4, return_sequences=True, activation="tanh"))(Bdir_layer)
    # Bdir_layer2形状:(None,6,8)
    
    # 扩展query的维度,从(None,5)变成(None,1,5),匹配注意力层的输入要求
    query_expanded = layers.Reshape((1, query_shape[0]))(query_input)
    
    # 初始化多头注意力层:num_heads=1,key_dim=5(和query最后一维一致),value_dim用LSTM输出的最后一维8
    attnLayer = layers.MultiHeadAttention(num_heads=1, key_dim=5, value_dim=8)
    
    # 调用注意力层:query是扩展后的查询向量,value是LSTM的输出
    # 注意力输出形状:(None,1,8),后续需要展平
    output_attn = attnLayer(query=query_expanded, value=Bdir_layer2)
    output_attn_flat = layers.Flatten()(output_attn)
    
    # 输出层
    outputs = layers.Dense(1, trainable=True, activation="sigmoid")(output_attn_flat)
    
    # 模型定义:输入是[x, query_input],输出是outputs
    model = Model(inputs=[x, query_input], outputs=outputs)    
    optm = optimizers.Adam(learning_rate=0.005)
    model.compile(optimizer=optm,
                   loss=losses.BinaryCrossentropy(from_logits=False),
                   metrics=['accuracy'])    
    return model    

# 传入形状,不是数据
model_attention = create_RNN_with_attention(
    input_shape=(X_train.shape[1], X_train.shape[2]),  # (6,3)
    query_shape=(QUERY_train.shape[1],)  # (5,)
)
model_attention.summary()

# 训练时需要传入两个输入
model_attention.fit([X_train, QUERY_train], y_train, epochs=10, batch_size=32)

关键修正说明:

  1. 输入分支:模型新增query_input作为查询向量的输入,函数参数接收query_shape(查询向量的形状)而非训练数据。
  2. 注意力层参数:value_dim设为LSTM输出的最后一维(双向LSTM每个方向4个单元,所以4*2=8),key_dim和查询向量的最后一维(5)保持一致。
  3. 维度扩展:查询向量原本是(batch_size,5),通过Reshape变成(batch_size,1,5),满足注意力层对query的形状要求((batch_size, query_seq_len, feature_dim))。
  4. 注意力调用:正确使用attnLayer(query=..., value=...)的方式,不需要额外定义冗余的Input张量。
  5. 模型输入输出:明确模型的输入是两个张量列表,训练时要同时传入X_train和QUERY_train,这也符合你参考的论文模型结构要求。

内容的提问来源于stack exchange,提问作者thelsales

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:58:03