关于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
相关产品推荐
相关产品推荐

