Neural network 如何在Pytork中定义一个损失函数,该函数依赖于模型w.r.t输入的偏导数?

Neural network 如何在Pytork中定义一个损失函数,该函数依赖于模型w.r.t输入的偏导数?,neural-network,pytorch,ode,Neural Network,Pytorch,Ode,在阅读了关于如何用神经网络解决ODE的文章和使用JAX库的文章之后,我试图用“普通”Pyrotch做同样的事情,但发现了一个相当“模糊”的点:如何正确使用函数(在本例中是模型)的偏导数w.r.t一个输入参数 要恢复如中所示的手头问题,其目的是在域-2快速解决方案中的条件y(x=0)=1下解决ODE y'=-2*x*y: 将allow_unused=True添加到.grad函数中。所以,改变 dydx = torch.autograd.grad( y, x, grad_output

在阅读了关于如何用神经网络解决ODE的文章和使用JAX库的文章之后,我试图用“普通”Pyrotch做同样的事情,但发现了一个相当“模糊”的点:如何正确使用函数(在本例中是模型)的偏导数w.r.t一个输入参数

要恢复如中所示的手头问题,其目的是在域-2快速解决方案中的条件y(x=0)=1下解决ODE y'=-2*x*y:

allow_unused=True
添加到
.grad
函数中。所以,改变

dydx = torch.autograd.grad(
    y, x,
    grad_outputs=y.data.new(y.shape).fill_(1),
    create_graph=True, retain_graph=True)[0]

d2ydx2 = torch.autograd.grad(dydx, x, grad_outputs=dydx.data.new(
    dydx.shape).fill_(1), create_graph=True, retain_graph=True)[0]

更多说明:

查看
允许未使用的
执行的操作:

allow_unused (bool, optional): If ``False``, specifying inputs that were not
        used when computing outputs (and therefore their grad is always zero)
        is an error. Defaults to ``False``.
因此,如果您试图将w.r.t区分为一个不用于计算值的变量,它将给出一个错误。另外,请注意,只有在使用线性图层时才会发生错误


这是因为当您使用线性层时,您有
y=W1*W2*x+b=Wx+b
,并且
dy/dx
不是
x
的函数,它只是
W
。因此,当您试图区分dy/dx时,它会抛出一个错误。只要使用sigmoid,此错误就会消失,因为
dy/dx
将是
x
的函数。为避免该错误,请确保
dy/dx
是x的函数,或使用
allow\u unused=True

参见torch。autograd@UmangGuptatorch.autograd允许计算一个张量w.r.t另一个张量的梯度(就像我在dydx中所做的那样,=torch.autograd.grad(y,x,grad_输出=y.data.new(y.shape).fill_1),create_graph=True,retain_graph=True)。我要寻找的是一种实例化函数(模型)梯度的方法,以避免作为参数传递(输入,输出),而是作为参数传递(输入,函数)…谢谢!不是
output=fn(x)
?所以你可以直接计算它?原则上是的,它似乎可以工作,但我仍然得到一个奇怪的行为,如文章编辑所示。在新的定义中,我可以通过(x,y)或(x,fun)到loss函数,但是我得到了一个运行时错误,目标nn,
ODE
fn的新代码对我有效。或者你能给我们看最后一个不起作用的代码片段吗?是的,谢谢,你是对的!所以我发现如果我只在第一层使用sigmoid,我会得到很好的结果,还有其他问题!在这种情况下,没有问题ed添加allow_unused=True
allow_unused (bool, optional): If ``False``, specifying inputs that were not
        used when computing outputs (and therefore their grad is always zero)
        is an error. Defaults to ``False``.