【问题标题】:Pytorch : How .grad() function returning result?Pytorch:.grad() 函数如何返回结果?
【发布时间】:2018-11-17 23:40:22
【问题描述】:

我正在尝试理解 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 to w ==> 1*a
而损失/净输出(5-净输出)w.r.t 到净输出 ==> (0-1)

这将是 1*a*-1 ==> -1

但问题是,如果我再次按下相同的单元格而不修改任何内容,那么我将获得 grad -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.])

等等..

我不知道那里发生了什么,为什么以及如何增加 grad 的价值?

【问题讨论】:

    标签: python python-3.x tensorflow deep-learning pytorch


    【解决方案1】:

    这是因为您没有将渐变归零。 loss.backward() 所做的是 accumulate 渐变 - 它为现有渐变添加渐变。如果您不将渐变归零,那么一遍又一遍地运行loss.backward() 只需继续将渐变相互添加即可。您要做的是在每一步之后将梯度归零,您将看到梯度计算正确。

    如果你已经建立了一个网络net(它应该是一个nn.Module 类对象),你可以简单地调用net.zero_grad() 将梯度归零。如果您还没有构建net(或torch.optim 对象),则必须自己手动将渐变归零。

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

    猜你喜欢
    • 2022-01-09
    • 2020-03-20
    • 2017-10-31
    • 2021-12-04
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多