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

关于PyTorch张量广播的疑问:矩阵乘法结果维度为何是[50,1]?

为什么PyTorch中矩阵乘法结果维度是[50,1]而非[50,2]?

这是个很容易混淆的矩阵运算维度问题,咱们一步步拆解来看:

首先先还原你的代码和输出:

import torch
d = 2
n = 50
X = torch.randn(n,d)
z = torch.tensor([[-1.0], [2.0]])
y = X @ z

print(X.size())
print(z.size())
print(y.size())

输出结果:

torch.Size([50, 2])
torch.Size([2, 1])
torch.Size([50, 1])

核心原因:@是标准矩阵乘法,遵循线性代数维度规则

你需要明确:PyTorch里的@运算符实现的是标准矩阵乘法(也叫矩阵点积),它严格遵循线性代数的维度匹配逻辑:

如果矩阵A的维度是(a, b),矩阵B的维度是(b, c),那么A@B的结果维度必然是(a, c)

回到你的代码:

  • X是(50, 2):可以理解为50个2维样本组成的矩阵(50行、2列)
  • z是(2, 1):这是一个2行1列的列向量(本质是2×1的矩阵)

按照矩阵乘法规则,50×2的矩阵 乘以 2×1的矩阵,结果自然是50×1的矩阵——也就是你看到的torch.Size([50,1])。

你预期的[50,2]是混淆了运算类型

你之前觉得结果应该是[50,2],大概率是把矩阵乘法和逐元素乘法搞混了:

  • 逐元素乘法用*运算符或torch.mul()实现,要求张量维度完全一致(或满足广播规则),运算后维度和输入一致
  • 而矩阵乘法是做线性变换,每个样本和z做内积,输出是单个数值,最终组成50×1的结果

如果确实想得到[50,2]的结果,可以改用逐元素乘法(配合广播):

z = torch.tensor([[-1.0, 2.0]])  # 调整为1×2的行向量
y = X * z  # 逐元素相乘,广播后结果维度为(50,2)

但要注意,这和你原来用@做的线性变换是完全不同的逻辑哦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 00:42:30