我有一个函数f(t,k)=tk+2tk^2,我想求出t=[1,2]和k=[2,3]时关于k的偏导数,我创建了一个Tensor矩阵,如下所示:伽马射线= [10,21 20,42]
当我试着求γ对k的导数时,我期望得到一个矩阵2*2,但是torch返回了一个向量,这是什么问题?
import torch
import numpy as np
t=torch.tensor([1.0], requires_grad=True)
k=torch.tensor([1.0], requires_grad=True)
gamma=torch.zeros((2,2))
def f(a,b): #c is a coeff vector
global t,k,gamma
t=torch.tensor(a, dtype=float,requires_grad=True)
k=torch.tensor(b, dtype=float,requires_grad=True)
for i in range(2):
for j in range(2):
gamma[i,j]=torch.mul(t[i],k[j])+torch.mul(2,torch.mul(t[i],torch.pow(k[j],2)))
a=[1,2]
b=[2,3]
f(a,b)
def dy_dx(y, x):
return torch.autograd.grad(y, x, grad_outputs=torch.ones_like(y),allow_unused=True, create_graph=True)
print(dy_dx(gamma,k))
我试着求f(t,k)对k的导数,t=[1,2],k=[2,2],我期望得到如下矩阵:[九、十三、十八、二十六]
但torch返回的向量如下所示:[第二十七条、第三十九条]
1条答案
按热度按时间vxf3dgd41#
根据PyTorch文档,grad函数:
计算并返回输出相对于输入的梯度之和。
为了计算函数输出相对于其参数的导数,应使用jacobian function。以下代码片段计算函数f(t,k)的一阶导数w.r.t. t和k:
输出:
如果您正在寻找一个更有效的
jacobian
计算方法,请将vectorize=True
参数传递给此函数。此外,此函数支持正向和反向模式自动微分。