我试图理解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.])
等等。。
我不明白那里发生了什么,为什么毕业生的价值在增加?