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

PyTorch中2D与3D张量的matmul运算问题求助

问题解决:实现指定形状的张量运算

可行方案

方案1:使用torch.einsum(推荐)

einsum能直观定义维度间的运算关系,完全不需要reshape操作:

import torch

a = torch.randn(125, 128)    # Shape: (125, 128)
b = torch.randn(128, 8, 64)  # Shape: (128, 8, 64)

result = torch.einsum('ij,jkl->ikl', a, b)
print(result.shape)  # 输出: torch.Size([125, 8, 64])

这里的'ij,jkl->ikl'含义:

  • i对应a的第一维(125),j对应a的第二维(128)
  • j对应b的第一维(128),k对应b的第二维(8),l对应b的第三维(64)
  • 对重叠的j维度求和,最终得到i-k-l的目标形状。

方案2:广播+维度求和

通过给a增加一个维度实现广播,再做元素乘法后求和:

result = (a.unsqueeze(-1) * b).sum(dim=1)
print(result.shape)  # 输出: torch.Size([125, 8, 64])

步骤说明:

  1. a.unsqueeze(-1)把a的形状变为(125, 128, 1),和b的(128, 8, 64)广播后,运算形状扩展为(125, 128, 8, 64)
  2. 元素乘法后,在第1维(原128维度)求和,得到目标形状。

原方法报错原因

torch.matmul的运算规则限制:当第一个张量是2D((m, n)),第二个是3D((n, p, q))时,matmul会将第二个张量的倒数第二维p视为需要和第一个张量的最后一维n匹配,但这里b的倒数第二维是8,和a的128不匹配,所以报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 04:17:12