【问题标题】:Getting the output's grad with respect to the input获取输出相对于输入的 grad
【发布时间】:2020-11-24 13:56:37
【问题描述】:

我目前正在尝试使用 Pytorch 实现 ODE Solver,我的解决方案需要计算每个输出 wtr 与其输入的梯度。

y = model(x)

for i in range(len(y)): #compute output grad wrt input
       y[i].backward(retain_graph=True)
    
ydx=x.grad 

我想知道是否有更优雅的方法来计算批处理中每个输出的梯度,因为对于高阶 ODE 和 PDE,代码会变得混乱。 我尝试使用:

torch.autograd.backward(x,y,retain_graph=True)

没有太大的成功。

【问题讨论】:

    标签: python pytorch ode autograd


    【解决方案1】:

    如果您的 PyTorch 版本已实现 API,请尝试 torch.autograd.functional.jacobian。我对 Burger 的方程做同样的事情,并在同一主题上发布了这个帖子:PyTorch how to compute second order jacobian?

    用深度学习解决偏微分方程是当下的热门话题

    【讨论】:

      【解决方案2】:

      您可以使用torch.autograd.grad 函数直接获取渐变。一个问题是它要求输出 (y) 是标量。由于您的输出是一个数组,因此您仍然需要遍历其值。

      调用看起来像这样。

      [torch.autograd.grad(outputs=out, inputs=x, retain_graph=True)[0][i] 
          for i, out in enumerate(y)]
      

      这是我的意思的一个例子。让我们考虑变量 x 的值 [1,2,3] 和一个仅对其输入进行平方的模型。

      x = torch.Tensor([1, 2, 3])
      x.requires_grad = True
      
      def model(x): return x ** 2
      
      y = model(x)
      

      现在,如果您按照我的描述拨打torch.autograd.grad,您将获得:

      [torch.autograd.grad(outputs=out, inputs=x, retain_graph=True)[0][i] 
          for i, out in enumerate(y)]
      
      # [tensor(2.), tensor(4.), tensor(6.)]
      

      这是衍生品的列表。到x - [ydx0, ydx1, ydx2]的值

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 1970-01-01
        相关资源
        最近更新 更多