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

PyTorch中批量张量矩阵乘法:3x3xn与3x1xn运算异常求助

解决PyTorch中批量矩阵乘法维度不匹配问题

问题根源

PyTorch的torch.matmul对高维张量遵循固定运算规则:最后两个维度被当作矩阵的行/列维度,其余维度为批量维度。做矩阵乘法时,要求第一个张量的最后一维等于第二个张量的倒数第二维,同时批量维度需支持广播。

你的张量R(3,3,125)最后两维是(3,125),T(3,1,125)最后两维是(1,125),完全不满足矩阵乘法的维度要求,因此报错。而torch.mul是逐元素相乘,只会输出和输入同维度的结果,不符合你的需求。

可行解决方案

方案1:调整维度顺序,将批量维度前置

把批量维度(125)移到第一维,让最后两维符合矩阵乘法的(3,3)和(3,1)结构:

import torch

T = torch.zeros(3,1,125)
R = torch.zeros(3,3,125)

# 重排维度:将batch维度放到最前面
T_reshaped = T.permute(2, 0, 1)  # 从(3,1,125)变为(125,3,1)
R_reshaped = R.permute(2, 0, 1)  # 从(3,3,125)变为(125,3,3)

out = torch.matmul(R_reshaped, T_reshaped)
# 再将维度转回目标格式
out = out.permute(1, 2, 0)
print(out.size())  # 输出: torch.Size([3, 1, 125])

方案2:转置T的矩阵维度,适配matmul规则

调整T的后两维,让R的最后一维(125)匹配T的倒数第二维(125):

import torch

T = torch.zeros(3,1,125)
R = torch.zeros(3,3,125)

# 转置T的第1和第2维度,得到(3,125,1)
T_reshaped = T.transpose(1, 2)
out = torch.matmul(R, T_reshaped)
# 转置回目标维度
out = out.transpose(1, 2)
print(out.size())  # 输出: torch.Size([3, 1, 125])

方案3:使用批量矩阵乘法torch.bmm

torch.bmm专门处理3维批量矩阵乘法,要求第一维是批量维度,因此同样需要调整维度顺序:

import torch

T = torch.zeros(3,1,125)
R = torch.zeros(3,3,125)

# 调整维度为(batch, row, col)格式
T_reshaped = T.permute(2, 0, 1)
R_reshaped = R.permute(2, 0, 1)

out = torch.bmm(R_reshaped, T_reshaped).permute(1, 2, 0)
print(out.size())  # 输出: torch.Size([3, 1, 125])

内容的提问来源于stack exchange,提问作者Rémi.T

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:42:26