TensorFlow/Keras矩阵乘报Dimensions must be equal维度不匹配求解
问题根因
不需要放弃Keras重写代码,报错完全是维度对齐逻辑错误导致,核心有三点:
- Keras的
Input层定义的shape不包含batch维度,实际前向传播时所有输入张量会自动在最外层拼接batch维,你定义的inputs_events实际运行形状是(batch_size, 50, 768),不是定义时写的(50,768) - 直接调用
tf.transpose(inputs_events)会默认逆序所有维度,转置后形状变成(768, 50, batch_size),batch维被转到了张量最后一位,和形状为(1,768)的可训练变量v做矩阵乘法时维度完全不匹配,触发报错 - 你之前尝试的方案结果错误,本质也是没有对齐batch维的位置,把batch维当成了特征维度参与矩阵计算
修复步骤
做两处调整即可:
- 转置带batch维的3阶输入张量时,只交换最后两个特征维度,保留第0位的batch维不动,不要全维度逆序
- 做批量矩阵乘法时,给可训练变量
v补充维度适配广播逻辑,让它自动对齐每个batch的计算,不需要手动复制v到每个batch样本上
修正后可运行代码
import tensorflow as tf from tensorflow import keras # 可训练v保留(1,768)形状也可以正常运行,不需要修改初始定义 v = tf.Variable(initial_value=tf.random.normal((1, 768)), trainable=True) inputs_sents = keras.Input(shape=(50, 3)) inputs_events = keras.Input(shape=(50, 768)) # 转置时指定perm参数,保留第0位batch维,交换最后两个维度 # 转置后inputs_events形状:(batch_size, 768, 50) events_t = tf.transpose(inputs_events, perm=[0, 2, 1]) # 给v补充batch广播维度,形状从(1,768)变为(1,1,768),批量matmul时自动广播到所有batch样本 # x_1输出形状:(batch_size, 1, 50) x_1 = tf.matmul(tf.expand_dims(v, axis=0), events_t) # 对齐维度后和inputs_sents做乘法,x_2输出形状为(batch_size, 1, 3),可根据业务需要squeeze掉长度为1的维度 x_2 = tf.matmul(x_1, inputs_sents) # 验证模型构建和前向传播 model = keras.Model(inputs=[inputs_sents, inputs_events], outputs=x_2) # 模拟batch=32的测试输入 test_sents = tf.random.normal((32, 50, 3)) test_events = tf.random.normal((32, 50, 768)) output = model([test_sents, test_events]) print(f"前向传播输出形状:{output.shape}") # 预期打印 (32, 1, 3)
补充说明:如果你的业务逻辑需要x_1输出形状为
(batch_size, 50),只需要在计算完x_1后加一行x_1 = tf.squeeze(x_1, axis=1)即可,再根据后续层的维度要求调整形状做矩阵乘法,核心逻辑始终是保证batch维在张量第0位,矩阵乘法只对最后两个维度做计算。
内容的提问来源于stack exchange,提问作者R__
相关产品推荐
相关产品推荐

