【发布时间】:2020-04-30 13:00:21
【问题描述】:
如何使用 Pytorch 计算沿维度的几何平均值?有些数字可能是负数。函数必须是可微的。
【问题讨论】:
标签: pytorch
如何使用 Pytorch 计算沿维度的几何平均值?有些数字可能是负数。函数必须是可微的。
【问题讨论】:
标签: pytorch
几何平均值的已知(合理)数值稳定版本是:
import torch
def gmean(input_x, dim):
log_x = torch.log(input_x)
return torch.exp(torch.mean(log_x, dim=dim))
x = torch.Tensor([2.0] * 1000).requires_grad_(True)
print(gmean(x, dim=0))
# tensor(2.0000, grad_fn=<ExpBackward>)
这种实现可以在例如 SciPy (see here) 中找到,这是一个相当稳定的库。
上面的实现不处理零和负数。有些人会争辩说,负数的几何平均数定义不明确,至少当并非所有负数都是负数时。
【讨论】:
torch.log(input_x) 替换为 torch.log(torch.clamp(input_x, torch.finfo(torch.dtype(input_x)).tiny))
torch.prod() 帮助:
import torch
x = torch.FloatTensor(3).uniform_().requires_grad_(True)
print(x)
y = x.prod() ** (1.0/x.shape[0])
print(y)
y.backward()
print(x.grad)
# tensor([0.5692, 0.7495, 0.1702], requires_grad=True)
# tensor(0.4172, grad_fn=<PowBackward0>)
# tensor([0.2443, 0.1856, 0.8169])
编辑:?怎么样
y = (x.abs() ** (1.0/x.shape[0]) * x.sign() ).prod()
【讨论】:
x = torch.Tensor([2.0] * 1000).requires_grad_(True),当你做x.prod()时你会得到无穷大。我想要一个数值更稳定的方法。