градиент / производная / разница по оси, как numpy.diff - PullRequest
0 голосов
/ 13 сентября 2018

Я уже давно борюсь с этим.Все, что я хочу, это функция torch.diff ().Однако многие матричные операции не кажутся легко совместимыми с тензорными операциями.

Я пробовал огромное количество различных комбинаций операций Pytorch, но ни одна из них не работает.

Из-за того, что Pytorch не реализовал эту базовую функцию, я начал с простой попыткивычтите элемент i+1 из элемента i вдоль определенной оси.

Однако вы не можете просто сделать это поэлементно (из-за ограничений тензора), поэтому я попытался построить другой тензор,с элементами, смещенными вдоль одной оси:

ix_plus_one = [0]+list(range(0,prediction.size(1)-1))
ix_differential_tensor = torch.LongTensor(ix_plus_one)
diff_one_tensor = prediction[:,ix_differential_tensor]

Но теперь у нас другая проблема - индексирование не на самом деле работает, чтобы имитировать NumPy в Pytorch, как он рекламирует, так что вы можете 'Индекс с «списочным» тензорным вот так.Я также пытался использовать тензорные scatter функции

Так что я все еще сталкиваюсь с этой простой проблемой - попытаться получить градиент на тензор Пиоч.

Все мои поиски приводят кПотрясающие возможности функции autograd у pytorchs, которая не имеет ничего общего с этой проблемой.

Ответы [ 2 ]

0 голосов
/ 15 мая 2019

Кажется, есть более простое решение для этого (как мне было нужно аналогично), ссылка здесь: https://discuss.pytorch.org/t/equivalent-function-like-numpy-diff-in-pytorch/35327/2

diff = x[1:] - x[:-1]

, который может быть сделан по разным параметрам, таким как

diff = polygon[:, 1:] - polygon[:, :-1]

Я бы порекомендовал написать модульный тест, который бы проверял идентичное поведение.

0 голосов
/ 10 декабря 2018

1D свертка с фиксированным фильтром должна помочь:

filter = torch.nn.Conv1d(in_channels=1, out_channels=1, kernel_size=2, stride=1, padding=1, groups=1, bias=False)
kernel = np.array([-1.0, 1.0])
kernel = torch.from_numpy(kernel).view(1,1,2)
filter.weight.data = kernel
filter.weight.requires_grad = False

Затем используйте filter, как если бы вы использовали любой другой слой в torch.nn.

Также вы можете изменить padding в соответствии с вашими потребностями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...