pytorch 矩阵偏导数与Torch

vmpqdwk3  于 2023-03-08  发布在  其他
关注(0)|答案(1)|浏览(193)

我有一个函数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返回的向量如下所示:[第二十七条、第三十九条]

vxf3dgd4

vxf3dgd41#

根据PyTorch文档,grad函数:
计算并返回输出相对于输入的梯度之和。
为了计算函数输出相对于其参数的导数,应使用jacobian function。以下代码片段计算函数f(t,k)的一阶导数w.r.t. t和k:

import torch

def f(t, k):  
  return t * k + 2 * t *  k ** 2

t = torch.tensor([1., 2., 4.], requires_grad=True)
k = torch.tensor([2., 3.], requires_grad=True)
T, K = torch.meshgrid(t, k, indexing='ij')

gamma = f(T,K)

jacobian_t, jacobian_k = torch.autograd.functional.jacobian(f, (T, K))

dfdt = jacobian_t[jacobian_t>0].reshape(len(t), len(k))
dfdk = jacobian_k[jacobian_k>0].reshape(len(t), len(k))

print(gamma)
print(dfdt)
print(dfdk)

输出:

tensor([[10., 21.],
        [20., 42.],
        [40., 84.]], grad_fn=<AddBackward0>)

tensor([[10., 21.],
        [10., 21.],
        [10., 21.]])

tensor([[ 9., 13.],
        [18., 26.],
        [36., 52.]])

如果您正在寻找一个更有效的jacobian计算方法,请将vectorize=True参数传递给此函数。此外,此函数支持正向和反向模式自动微分。

相关问题