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

