Я думаю, что главная проблема в том, что ваши размеры не совпадают.Почему вы не хотите использовать torch.sum
?
Это должно работать для вас:
# %matplotlib inline added this line only for jupiter notebook
import torch
import matplotlib.pyplot as plt
x = torch.linspace(-10, 10, 10, requires_grad=True)
y = x**2 # removed the sum to stay with the same dimensions
y.backward(x) # handing over the parameter x, as y isn't a scalar anymore
# your function
plt.plot(x.detach().numpy(), x.detach().numpy(), label='x**2')
# gradients
plt.plot(x.detach().numpy(), x.grad.detach().numpy(), label='grad')
plt.legend()
График вывода:
Вы получите более красивую картинку, хотя с большим количеством шагов я также немного изменил интервал на torch.linspace(-2.5, 2.5, 50, requires_grad=True)
:
Редактировать относительно комментария:
Эта версия отображает градиенты с torch.sum
в комплекте:
# %matplotlib inline added this line only for jupiter notebook
import torch
import matplotlib.pyplot as plt
x = torch.linspace(-10, 10, 10, requires_grad=True)
y = torch.sum(x**2)
y.backward()
print(x.grad)
plt.plot(x.detach().numpy(), x.grad.detach().numpy(), label='grad')
plt.legend()
Вывод:
tensor([-20.0000, -15.5556, -11.1111, -6.6667, -2.2222, 2.2222,
6.6667, 11.1111, 15.5556, 20.0000])
Сюжет: