pytorch:计算向量函数的向量雅可比积

2024-04-20 15:06:32 发布

您现在位置:Python中文网/ 问答频道 /正文

你好

我正在努力掌握torch.autograd的基本知识。我特别想从https://pytorch.org/tutorials/beginner/blitz/autograd_tutorial.html#sphx-glr-beginner-blitz-autograd-tutorial-py测试这个语句


enter image description here


我的想法是构造一个向量函数,比如:

(y_1;y_2;y_3)=(x_1*x_1+x_2;x_2*x_2+x_3;x_3*x_3)

然后计算点(1,1,1)处的雅可比矩阵,并将其乘以向量(3,5,7)

雅可比矩阵=(2x_1;1;0.) (0.;2x_2;1) (0.;0.;2x_3)

我期望结果Jacobian(x=(1,1,1))*v=(6+5,10+7,2*7)=(11,17,14)

下面是我在pytorch中的尝试:

import torch

x = torch.ones(3, requires_grad=True)
print(x)

y = torch.tensor([x[0]**2 + x [1], x[1]**2 + x[2], x[2]**2], requires_grad=True)
print(y)

v = torch.tensor([3, 5, 7])

y.backward(v)
x.grad

给出了不期望的结果(2,2,1.)。我想我对张量y的定义是错误的。如果我简单地做y=x*2,那么梯度就行了,但在这种情况下,创建更复杂的张量怎么样

多谢各位


Tags: httpstrue矩阵torchpytorch向量tutorialtensor
1条回答
网友
1楼 · 发布于 2024-04-20 15:06:32

不应通过torch.tensor()定义张量y,torch.tensor()是张量构造函数,而不是运算符,因此它在运算图中不可跟踪。您应该改用torch.stack()

只需将该行更改为:

y = torch.stack((x[0]**2+x[1], x[1]**2+x[2], x[2]**2))

x.grad的结果应该是tensor([ 6., 13., 19.])

相关问题 更多 >