Недавно я изучаю Pytorch и обратную функцию пакета. Я понял, как его использовать, но когда я пытаюсь
x = Variable(2*torch.ones(2, 2), requires_grad=True)
x.backward(x)
print(x.grad)
Я жду
tensor([[1., 1.],
[1., 1.]])
потому что это функция тождества. Однако он возвращается
tensor([[2., 2.],
[2., 2.]]).
Почему это происходит?





Собственно, это то, что вы ищете:
Случай 1: когда z = 2*x**3 + x
import torch
from torch.autograd import Variable
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x*x*2+x
z.backward(torch.ones_like(z))
print(x.grad)
выход:
tensor([[25., 25.],
[25., 25.]])
Случай 2: когда z = x*x
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x*x
z.backward(torch.ones_like(z))
print(x.grad)
выход:
tensor([[4., 4.],
[4., 4.]])
Случай 3: когда z = x (ваш случай)
x = Variable(2*torch.ones(2, 2), requires_grad=True)
z = x
z.backward(torch.ones_like(z))
print(x.grad)
выход:
tensor([[1., 1.],
[1., 1.]])
Чтобы узнать больше о том, как рассчитать градиент в pytorch, проверьте это.
Это эквивалентно dy_dx = grad(outputs=y, inputs=x, grad_outputs=torch.ones_like(y))
То, что вы передаете выше, - это x, который является тензором ([[2., 2.], [2., 2.]])
Я думаю, вы неправильно понимаете, как использовать tensor.backward(). Параметр внутри backward() не является x dy/dx.
Например, если y получено из x какой-либо операцией, то y.backward(w), сначала pytorch получит l = dot(y,w), а затем рассчитает dl/dx.
Итак, для вашего кода l = 2x сначала вычисляется pytorch, а затем dl/dx — это то, что возвращает ваш код.
Когда вы делаете y.backward(w), просто сделайте параметр backward() полным 1, если y не является скаляром; в противном случае просто нет параметра.
Что такое dot? torch.dot поддерживает только 1d tesnor
Итак, я предполагаю, что форма тензора внутри reverse() определяет форму выходных данных. Какова роль размера? Просто умножение?