Python 如何使用就地ops断开PyTorch autograd

Python 如何使用就地ops断开PyTorch autograd,python,pytorch,autograd,Python,Pytorch,Autograd,我正试图更好地理解PyTorch autograd中就地操作的作用。 我的理解是,它们可能会导致问题,因为它们可能会覆盖倒退过程中所需的值 我正在尝试建立一个例子,其中一个就地操作破坏了自动微分,我的想法是在反向传播过程中,在它被用来计算其他张量之后,覆盖一些需要的值 我使用赋值作为就地操作(我尝试了+=,得到了相同的结果),我通过以下方式再次检查了它是否为就地操作: x=torch.arange(5,dtype=torch.float,需要_grad=True) y=x y[3]=-1 打印(

我正试图更好地理解PyTorch autograd中就地操作的作用。 我的理解是,它们可能会导致问题,因为它们可能会覆盖倒退过程中所需的值

我正在尝试建立一个例子,其中一个就地操作破坏了自动微分,我的想法是在反向传播过程中,在它被用来计算其他张量之后,覆盖一些需要的值

我使用赋值作为就地操作(我尝试了
+=
,得到了相同的结果),我通过以下方式再次检查了它是否为就地操作:

x=torch.arange(5,dtype=torch.float,需要_grad=True)
y=x
y[3]=-1
打印(x)
印刷品:

tensor([ 0.,  1.,  2., -1.,  4.], grad_fn=<CopySlices>)
这张照片

tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
  • 使用就地op:
  • x=torch.arange(5,dtype=torch.float,需要_grad=True)
    out1=x**2
    out2=out1/10
    out1[3]=0
    out2.sum().backward()
    打印(x.grad)
    
    这张照片是:

    tensor([0.0000, 0.2000, 0.4000, 0.6000, 0.8000])
    
    我希望获得不同的学位

    • 项目分配在做什么?我没有得到
      grad\u fn=
    • 为什么它返回相同的毕业生
    • 是否有破坏自动标记的就地操作的工作示例
    • 是否有不向后兼容的PyTorch操作列表

    破坏自动加载的就地操作的工作示例:

    x=torch.ones(5,需要_grad=True)
    x2=(x+1).sqrt()
    z=(x2-10)
    x2[0]=-1
    z、 sum().backward()
    
    提出:

    RuntimeError:梯度计算所需的一个变量已被就地操作修改:[torch.FloatTensor[5]],它是SqrtBackward的输出0,处于版本1;应为版本0。提示:使用torch.autograd.set_detect_normal(True),启用异常检测以查找无法计算其梯度的操作。