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

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__

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:36:07