代码之家  ›  专栏  ›  技术社区  ›  Aaditya Ura

pytorch:how.grad()函数返回结果?

  •  1
  • Aaditya Ura  · 技术社区  · 6 年前

    我试图理解python中的grad()函数,我知道反向传播,但对.grad()函数的结果有些怀疑。

    所以,如果我有一个非常简单的网络,比如一个输入和一个权重:

    import torch
    from torch.autograd import Variable
    from torch import FloatTensor
    
    
    a_tensor=Variable(FloatTensor([1]))
    weight=Variable(FloatTensor([1]),requires_grad=True)
    

    现在我在iPython手机里运行这个:

    net_out=a_tensor*weight
    loss=5-net_out
    loss.backward()
    print("atensor",a_tensor)
    print('weight',weight)
    print('net_out',net_out)
    print('loss',loss)
    print(weight.grad)
    

    在第一次运行期间,它返回:

    atensor tensor([ 1.])
    weight tensor([ 1.])
    net_out tensor([ 1.])
    loss tensor([ 4.])
    tensor([-1.])
    

    这是正确的,因为如果我是对的,那么计算梯度方程就在这里:

    现在netout/w将是(w*a)w.r.t到w==>1*a
    损耗/网络输出(5-netout)w.r.t到网络输出==>(0-1)

    也就是1*a*-1==>-1

    但问题是,如果我再按同一个单元格而不做任何修改,那么我就得到了-2,-3,-4…等

    atensor tensor([ 1.])
    weight tensor([ 1.])
    net_out tensor([ 1.])
    loss tensor([ 4.])
    tensor([-2.])
    

    下一步:

    atensor tensor([ 1.])
    weight tensor([ 1.])
    net_out tensor([ 1.])
    loss tensor([ 4.])
    tensor([-3.])
    

    等等。。

    我不明白那里发生了什么,为什么毕业生的价值在增加?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Aaditya Ura    6 年前

    这是因为你没有调零梯度。什么 loss.backward() 确实是 积累 渐变-它将渐变添加到现有渐变。如果你不调零坡度,那就跑 损失。向后() 一次又一次地把梯度加在一起。你要做的是在每一步之后将梯度归零,你会看到梯度计算正确。

    如果你建立了一个网络 net (应该是 nn.Module 类对象),只需调用 net.zero_grad() . 如果你没有建立一个 (或) torch.optim 对象)必须手动将渐变归零。

    使用 weight.grad.data.zero_() 方法。