Pytorch 使用autograd计算输出相对于输入的雅可比矩阵

Pytorch 使用autograd计算输出相对于输入的雅可比矩阵,pytorch,autograd,Pytorch,Autograd,如果这个问题很明显或者很琐碎,我道歉。我是Pytork的新手,我正在努力理解Pytork中的autograd.grad函数。我有一个神经网络G,它接受输入(x,t)和输出(u,v)。以下是G的代码: class GeneratorNet(火炬网络模块): """ 一种三隐层生成神经网络 """ 定义初始化(自): 超级(GeneratorNet,self)。\uu初始化 self.hidden0=nn.Sequential( nn.线性(2100), nn.LeakyReLU(0.2) ) se

如果这个问题很明显或者很琐碎,我道歉。我是Pytork的新手,我正在努力理解Pytork中的autograd.grad函数。我有一个神经网络G,它接受输入(x,t)和输出(u,v)。以下是G的代码:

class GeneratorNet(火炬网络模块):
"""
一种三隐层生成神经网络
"""
定义初始化(自):
超级(GeneratorNet,self)。\uu初始化
self.hidden0=nn.Sequential(
nn.线性(2100),
nn.LeakyReLU(0.2)
)
self.hidden1=nn.Sequential(
nn.线性(100100),
nn.LeakyReLU(0.2)
)
self.hidden2=nn.Sequential(
nn.线性(100100),
nn.LeakyReLU(0.2)
)
self.out=nn.Sequential(
nn.线性(100,2),
nn.Tanh()
)
def前进(自身,x):
x=自隐藏0(x)
x=自隐藏1(x)
x=自隐藏2(x)
x=自输出(x)
返回x
或者简单地说G(x,t)=(u(x,t),v(x,t)),其中u(x,t)和v(x,t)是标量值。目标:计算$\frac{\partial u(x,t)}{\partial x}$和$\frac{\partial u(x,t)}{\partial t}$。在每一个训练步骤中,我都有一个100美元大小的小批量,因此u(x,t)是一个[100,1]张量。下面是我计算偏导数的尝试,其中coords是输入(x,t),就像下面一样,我也向coords添加了
requires\u grad\u(True)
标志:

tensor=GeneratorNet(坐标)
张量。需要梯度(真)
u、 v=火炬分裂(张量,1,尺寸=1)
du=autograd.grad(u,coords,grad_输出=torch.one_like(u),create_graph=True,
retain_graph=True,only_inputs=True,allow_unused=True)[0]
du现在是一个[100,2]张量。 问题:这是小批量的100个输入点的部分张量吗


也有类似的问题,比如计算输出对输入的导数,但我无法真正弄清楚到底发生了什么。我再次道歉,如果这是已经回答或琐碎。非常感谢。

您发布的代码应该会给出您的第一个输出的偏导数w.r.t.输入。但是,您还必须在输入上设置
requires_grad(True)
,否则PyTorch不会从输入开始构建计算图,因此无法计算它们的梯度

此版本的代码示例计算
du
dv

net=GeneratorNet()
coords=torch.randn(10,2)
coords.requires_grad=True
张量=净(坐标)
u、 v=火炬分裂(张量,1,尺寸=1)
du=torch.autograd.grad(u,coords,grad_输出=torch.one_like(u))[0]
dv=火炬自动爬升梯度(v,坐标,梯度输出=火炬自动爬升梯度(v))[0]
您还可以计算单个输出的偏导数:

net=GeneratorNet()
coords=torch.randn(10,2)
coords.requires_grad=True
张量=净(坐标)
u、 v=火炬分裂(张量,1,尺寸=1)
du_0=火炬自动爬升梯度(u[0],坐标)[0]
其中
du\u 0==du[0]