You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在PyTorch中正确计算张量的加权平均值?

计算C维特征加权平均值的正确方式

当然可以用你提到的方法实现,而且这才是加权平均的标准计算逻辑,和torch.mul(A, W).mean(1)有着本质区别,我来给你拆解清楚:

为什么你的方法是对的?

先理清楚张量的运算逻辑:

  • 张量A是(C, H),对应H个空间位置的C维特征;权重W是(H),PyTorch的torch.mul会自动广播W到(C, H)的形状,和A逐元素相乘得到Z(形状还是(C, H))。
  • 对Z在dim=1(也就是空间位置维度)求和,得到的是每个特征维度的加权总和,形状为(C)
  • 最后除以权重W的总和,就得到了每个特征维度的加权平均值——这完全贴合加权平均的定义:每个空间位置的贡献由对应权重W决定,最终均值是加权总和除以权重的总权重。

torch.mul(A, W).mean(1)的区别

torch.mul(A, W).mean(1)其实是对加权后的Z做算术平均,也就是除以空间位置的数量H,而不是权重的总和。只有当W的总和恰好等于H时(比如W全为1),这两种方法的结果才会一致;但如果W是任意权重(比如归一化后的权重、或者不同位置权重差异较大),两者的结果会完全不同——显然你的方法才是真正的加权平均。

代码示例验证

import torch

# 构造测试张量
C, H = 3, 4
A = torch.randn(C, H)  # 3维特征,4个空间位置
W = torch.rand(H)       # 4个位置的随机权重

# 你的加权平均方法
Z = torch.mul(A, W)
weighted_avg = torch.sum(Z, dim=1) / torch.sum(W)

# 对比错误的算术平均方法
wrong_avg = torch.mul(A, W).mean(1)

print("加权平均值:", weighted_avg)
print("错误的算术平均结果:", wrong_avg)
print("权重总和:", torch.sum(W))

如果你的权重W已经是归一化后的权重(也就是torch.sum(W) == 1),那直接对Z做torch.sum(Z, dim=1)就可以得到加权平均,不需要再除以权重总和,这一步可以简化。

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

火山引擎 最新活动