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

PyTorch中如何向量化计算两个3D张量两两的平均绝对差

向量化计算两两图像平均绝对差实现

完全可以通过PyTorch广播机制实现无Python循环的向量化计算,效率远高于for循环写法。

原有代码问题

你之前的维度调整逻辑错误:将B变形为(1,10,28,28)后,和3维的A(20,28,28)做广播对齐时,无法生成A、B所有图像的配对组合,最终仅得到对角线位置的计算结果,不符合(20,10)全配对的输出要求。

正确实现方法

广播机制要求两个张量从最后一维开始向前对齐,对应维度要么长度相等,要么其中一个长度为1(该维度会自动扩展复制到匹配长度)。要生成所有图像对的差张量,需要先调整两个张量的维度:

  • 给A在第1维插入长度为1的维度,形状从(20,28,28)转为(20, 1, 28, 28)
  • 给B在第0维插入长度为1的维度,形状从(10,28,28)转为(1, 10, 28, 28)

两个张量做差时会自动广播为(20,10,28,28)的4维张量,其中位置(i,j,:,:)对应A中第i张图和B中第j张图的逐像素差值,之后在最后两个图像维度求平均绝对差,就能得到目标形状为(20,10)的结果矩阵。

代码实现如下,两种写法等价:

# 用None插入维度的简写方式
L1_vec = (A[:, None] - B[None]).abs().mean(dim=(-2, -1))

# 用unsqueeze插入维度的显式写法,可读性更强
L1_vec = (A.unsqueeze(1) - B.unsqueeze(0)).abs().mean(dim=(-2, -1))

结果验证

执行以下代码可验证向量化结果和原有for循环结果完全一致(浮点计算精度误差范围内):

print(torch.allclose(L1, L1_vec))  # 输出为True

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:06:19