pytorch(5)-自动求梯度

自动求梯度

torch提供了简便的求梯度方法:带入变量值x,求解目标函数f(x),将目标函数的值反向传播f.backward(),就能计算对应变量的导数。

例如最简单的直线函数:
f ( x ) = a x 2 + b f(x)=ax^2+b f(x)=ax2+b
其中:a,b是已知的参数,对x 求导:
f ′ ( x ) = 2 a x f'(x)=2ax f(x)=2ax
a = 1 , x = 1 时 a=1,x=1时 a=1,x=1
f ′ ( x ) = 2 f'(x)=2 f(x)=2
针对神经网络,其实际上是网络权重参数的函数net(w)。依据上面的流程,随机初始化w后,输入观测数据x(图像 或者 其他需要分类或者回归的数据)。net(w).backward()就可以求出对应的网络参数w的梯度。再利用各种优化算法(SGD,admn)更新各个网络参数w即可。

注意事项:在每次损失函数反向传播计算梯度时,原本的参数梯度必须设置为0。否则,各个参数的梯度会累加之前的梯度。

网络参数梯度置0:

optimizer=torch.optim.SGD(net.parameters(),lr=0.001,momentum=0.1)
optimizer.zero_grad()
loss.backward()

demo1:梯度累加示例

import torch
from torch.autograd import Variable
x1 = Variable(torch.Tensor([1]),requires_grad=True)

def f(x):
    return x**2

y=f(x1)
y.backward()

x1.grad.data.zero_()
y=f(x1)
y.backward()

y=f(x1)
y.backward()

print(x1.grad)

#如果x1.grad 每次计算前梯度不归零,那么当前的梯度会与原来的梯度累加
#每次loss 反向传播前需要将梯度设置为0
print('end')

你可能感兴趣的:(pytorch)