Pytorch 定义ReLU自动加载函数时,为什么需要克隆grad_输出并将其分配给grad_输入?

Pytorch 定义ReLU自动加载函数时,为什么需要克隆grad_输出并将其分配给grad_输入?,pytorch,backpropagation,autograd,Pytorch,Backpropagation,Autograd,我正在浏览pytorch教程的自动签名部分。我有两个问题: 为什么我们需要克隆grad\u输出,并将其分配给grad\u输入,而不是在反向传播期间进行简单分配 梯度输入[input

我正在浏览pytorch教程的自动签名部分。我有两个问题:

  • 为什么我们需要克隆
    grad\u输出
    ,并将其分配给
    grad\u输入
    ,而不是在反向传播期间进行简单分配
  • 梯度输入[input<0]=0
    的目的是什么?这是否意味着当输入小于零时,我们不更新梯度
  • 代码如下:

    MyReLU类(torch.autograd.Function): @静力学方法 def前进档(ctx,输入): """ 在向前传球时,我们收到一个包含输入和返回的张量 包含output.ctx的张量是可以使用的上下文对象 为反向计算存储信息。您可以缓存任意 使用ctx.save_for_backward方法在向后过程中使用的对象。 """ ctx.save_for_backward(输入) 返回输入。钳位(最小值=0) @静力学方法 def向后(ctx、梯度输出): """ 在后向传递中,我们得到一个包含损失梯度的张量 关于输出,我们需要计算损耗的梯度 关于输入。 """ 输入,=ctx.u张量 grad\u input=grad\u output.clone() 梯度输入[输入<0]=0 返回梯度输入 链接此处:

    先谢谢你

    为什么我们需要克隆grad_输出并将其分配给grad_输入,而不是反向传播期间的简单分配

    tensor.clone()
    clone
    是一种复制张量的方法,同时仍将该副本保留为其来源的计算图的一部分

    因此,
    grad\u输入
    grad\u输出
    是同一计算图的一部分,如果我们计算
    grad\u输出
    的梯度,那么
    grad\u输入
    也会做同样的事情

    因为我们在
    梯度输入中进行了更改,所以我们首先克隆它

    “梯度输入[输入<0]=0”的目的是什么?这是否意味着当输入小于零时,我们不更新梯度


    这是根据ReLU函数的定义完成的。ReLU函数是
    f(x)=max(0,x)
    。这意味着如果感谢你的回答,你真的帮了我很多!不只是执行
    返回梯度输出。夹紧(最小值=0)
    返回F.relu(梯度输出)
    的原因是什么?克隆方法更有效吗?