【发布时间】: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