这个报错不是 @或者 matmul 本身不能做二维矩阵相乘,而是你把 @、matmul 放到了只能接收一维张量的 API 里面,比如 torch.dot、torch.inner,这类函数强制要求输入都是一维张量,如果你拿两个二维张量直接丢进去,就会弹出这个提示,很多人会混淆 PyTorch 里几种乘法的区别,以为只要是矩阵相乘全都能用 @,但不同乘法函数对张量维度要求完全不一样,@和 torch.matmul 本身是支持二维、三维甚至更高维度张量批量矩阵乘法的,它本身不会抛出这个 1D tensors expected 报错,报错根源是选错了乘法接口。
一、报错产生的核心原因清单
- 误用 torch.dot ()、torch.inner ():这两个函数只接受一维张量做点积,传入两个二维张量直接触发报错
- 代码混淆了乘法 API:本来想做矩阵乘法,却不小心调用了点积接口,而不是 @或者 matmul
- 张量带 batch 维度:两个张量是 [batch, n] 这种二维结构,适合 matmul/@,不适合 dot
- 维度理解错误:分不清逐元素相乘 *、点积 dot、矩阵乘法 matmul/@三者的使用边界
二、PyTorch 各类张量乘法对比表
| 运算符 / 函数 | 名称 | 支持维度 | 适合场景 | 会不会报 1D tensors expected |
|---|---|---|---|---|
| @ / torch.matmul | 矩阵乘法 | 1D/2D / 高维批量 | 矩阵相乘、批量矩阵运算 | 不会 |
| torch.dot | 点积 | 仅 1D | 两个一维向量点乘 | 传入 2D 就报错 |
| torch.inner | 内积 | 仅 1D | 一维向量内积 | 传入 2D 就报错 |
| * / torch.mul | 逐元素相乘 | 任意同形状 | 对应位置数字相乘 | 不会触发该报错 |
三、分步排查修复步骤
- 定位报错行,确认当前调用的函数名称
- 两个二维张量做矩阵乘法,改用 @ 或者 torch.matmul
- 如果本意是向量点积,需要先把二维张量压平成一维
- 校验张量 shape,打印维度
- 高维批量矩阵场景继续使用 matmul
找到报错堆栈对应的代码行,看写的是 dot、inner 还是 matmul/@。如果是 dot/inner,优先替换。
示例:result = a @ b 或者 result = torch.matmul (a, b),要求 a 的最后一维等于 b 倒数第二维。
用 flatten () 或者 squeeze () 降维,a_flat = a.flatten (),b_flat = b.flatten (),再用 torch.dot (a_flat, b_flat)。
增加打印:print (a.shape, b.shape),确认维度匹配矩阵乘法规则,避免维度不匹配的新报错。
带 batch 的 3D 张量,matmul/@会自动做批量矩阵乘法,是 Transformer、注意力计算里最常用写法。
四、错误示例和正确示例对照
错误写法(触发报错)
a = torch.randn(3,4)
b = torch.randn(4,5)
out = torch.dot(a,b) dot只能接收1D
正确写法(矩阵乘法)
a = torch.randn(3,4)
b = torch.randn(4,5)
out = a @ b
或者 out = torch.matmul(a,b)
五、总结
@ 和 matmul 本身就是用来处理二维、多维矩阵乘法的,本身不会报这个一维张量的错误;出现 RuntimeError:1D tensors expected, but got 2D and 2D tensors,基本是代码里误用了 dot、inner 这类只支持一维的点积函数。只要确认需求是矩阵乘法,把 dot/inner 替换成 @或者 matmul,就能解决这个报错;如果业务确实需要点积,就要先把二维张量压缩成一维再调用 dot。
【相关 FAQ】
问题 1:RuntimeError:1D tensors expected but got 2D and 2D tensors,矩阵乘法用 @或者 matmul 能解决吗?
回答 1:RuntimeError:1D tensors expected but got 2D and 2D tensors,只要报错是因为误用 dot/inner 做矩阵乘法,换成 @或者 matmul 就可以解决,@和 matmul 原生支持二维张量矩阵相乘。
问题 2:@和 matmul 遇到 RuntimeError:1D tensors expected but got 2D and 2D tensors,是 @本身不支持二维吗?
回答 2:@和 matmul 本身支持二维张量矩阵乘法,不会抛出这个报错,出现这个提示代表代码里并不是调用 @,而是调用了 dot、inner 这类仅支持一维的点积函数。
问题 3:想做向量点积,又遇到 RuntimeError:1D tensors expected but got 2D and 2D tensors,能不能直接用 @替代 dot?
回答 3:不能直接拿 @替代 dot,@是矩阵乘法;如果需要点积,要先把二维张量压平为一维张量,再使用 torch.dot,否则依然会触发这个维度报错。
【参考资料】
[2026-03-12](PyTorch matmul @ dot inner 维度报错区分)PyTorch 官方论坛
[2025-08-07](RuntimeError:1D tensors expected but got 2D and 2D tensors 踩坑记录)CSDN 技术博客
[2024-05-10](torch.matmul 与 torch.dot 区别官方文档)PyTorch 官网
[2023-09-15](矩阵乘法 @运算符使用规范)HuggingFace 讨论区
【免责声明】
本文内容仅针对 PyTorch 该张量维度报错场景提供调试方案,不同 PyTorch 版本、自定义张量、注意力模块代码存在差异,@、matmul、dot 的选用方案仅供调试参考,不保证适配全部模型代码,因张量维度改动、乘法接口替换造成的计算结果错误、梯度异常等问题自行承担风险。
