先打印报错张量的shape并对照提示中的dimension Z,重点检查该维是否满足“相等或其一为1”;常见陷阱包括维度对齐歧义、rank不一致及函数输入shape约定不符。

直接看报错末尾的 size(),再比对参与运算的两个张量实际 shape,90% 的问题当场就能定位——别猜、别跳过 print,先让形状“露出来”。
报错末尾的 size() 就是真相
PyTorch 报错从不模糊,比如 RuntimeError: mat1 and mat2 shapes cannot be multiplied (3x4) and (5x6),括号里就是真实 shape。它不会说“你传错了”,而是明确告诉你:左操作数最后维是 4,右操作数倒数第二维是 5,4 ≠ 5 → 失败。
- 所有矩阵乘法(
@、torch.matmul、nn.Linear)都只检查这一条规则:a.shape[-1] == b.shape[-2] - 广播错误(如
The size of tensor a (X) must match tensor b (Y) at non-singleton dimension Z)则要盯住提示里的dimension Z,然后用print(a.shape)和print(b.shape)对齐看那一维 - 像
torch.cat()或torch.stack()报错时,错误信息常带except in dimension N,说明其他维度必须严格相等,只允许在指定维上不同
print(shape) 前加一行,省掉半小时 debug
别依赖变量名或注释判断 shape,运行时可能早已被 reshape、squeeze、transpose 改过。在报错行前插入两行:
print('x:', x.shape)<br>print('w:', w.shape)<br># 然后才是 x @ w 或 F.linear(x, w)- 对 CNN 输出接全连接层,常见误写
x.view(-1, C*H*W)—— 它会把 batch 维“吃掉”,正确是x.view(x.size(0), -1) - embedding 层输出是
[B, T, D],LSTM 默认batch_first=False时会变成[T, B, D],后续接线性层前必须确认维度对齐 - 标量 loss(
shape=torch.Size([]))直接参与运算会出错,要用loss.unsqueeze(0)转成[1],不能用unsqueeze(1)(空维度无法 unsqueeze)
用 torch.broadcast_shapes() 提前验证广播合法性
PyTorch 2.0+ 提供了 torch.broadcast_shapes(*shapes),它不执行运算,只返回广播后的目标 shape 或抛出 ValueError。适合在自定义 loss/metric 开头做守门员:
立即学习“Python免费学习笔记(深入)”;
try:<br> out_shape = torch.broadcast_shapes(a.shape, b.shape)<br>except RuntimeError as e:<br> print(f'Broadcast failed between {a.shape} and {b.shape}: {e}')<br> raise- 比等 runtime 报错快得多,尤其适合批量处理多个张量前做预检
- 注意它不处理矩阵乘法规则,只管广播;
matmul类错误仍得靠手动核对[-1]和[-2] - 对
F.interpolate()这类函数,它不适用——那属于输入约定问题,不是广播问题
最常被忽略的是:很多 shape 错误其实发生在数据加载环节(比如 DataLoader 返回的 batch 缺少 batch 维),而不是模型内部。检查 __getitem__ 和 collate_fn 的输出 shape,比反复调模型 forward 更有效。


















