Как рассчитать геометрию c среднее значение дифференцируемым способом? - PullRequest
1 голос
/ 13 января 2020

Как рассчитать среднее значение c по измерению с помощью Pytorch? Некоторые числа могут быть отрицательными. Функция должна быть дифференцируемой.

Ответы [ 2 ]

3 голосов
/ 15 января 2020

Известная (разумно) численно-стабильная версия геометрии c означает:

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 ( см. Здесь ), что является довольно стабильной библиотекой.

0 голосов
/ 14 января 2020

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...