pytorch学习3-Autograd 自动微分 - 一抹阳光~绚烂

pytorch学习3-Autograd 自动微分

1.深度学习算法本质上是通过反向传播求导数,pytorch的Autograd模块实现了自动提供微分的功能,能够避免手动计算导致的复杂过程。autograd.Variable是Autograd的核心类,简单封装了Tensor,并支持几乎所有的Tensor的操作。通过调用其中的.backward(反向传播)实现反向传播,自动计算梯度。

2.Variable主要包括三个属性(也是Variable的数据结构)

(1)data:保存Variable的Tensor(数组)

(2)grad:保存data对应的梯度,grad数据类型是Variable,不是Tensor,和data的形状一样

(3)grad_fn:指向Function对象,Function用来反向传播计算输入的梯度

Variable的数据结构有三部分:data、grad、grad_fn

3.使用前需要导入Variable类

from torch.autograd import Variable

4.使用Tensor新建Variable

x=Variable(t.ones(2,2),requires_grad=True) #新建两行两列的Variable,每个位置的值为1

Out[4]:

tensor([[ 1.,  1.],
        [ 1.,  1.]])

5.求和

y=x.sum()
y
#求内容的和

Out[8]:

tensor(4.)

6.反向传播求梯度

y.grad_fn #指向function对象,用来反向传播计算输入的梯度
y.backward() #反向传播 x.grad #计算梯度

grad反向传播过程中是累加的,在每次运行反向传播,梯度都会累加之前的梯度,因此每次反向传播时都需要清零。

7.清零之后反向传播

x.grad.data.zero_()  #梯度清零
#反向传播,计算梯度
y.backward()
x.grad

8.Variable和Tensor具有几乎一致的接口,实际使用中可以无缝切换

以求cos为例

#Variable和Tensor可以无缝切换
x=Variable(t.ones(4,5)) #将x设置成4行5列的每个元素都为1的数组
y=t.cos(x)  
x_tensor_cos=t.cos(x.data) #对每个元素都求cos
print(y)
x_tensor_cos     #输出cos值