1.2 Autograd:自动微分

Pytorch的Autograd模块实现了深度学习算法本质上的反向传播求导数的功能。

autograd.Variable是Autograd中的核心类,简单封装了Tensor,支持几乎所有的Tensor操作。Tensor在被封装为Variable之后,可以调用.backward实现反向传播,自动计算所有梯度。

1. autograd.Variable主要包括三个属性:

① data: 保存Variable所包含的Tensor。

② grad: 保存data对应的梯度,grad也是一个Variable,而不是Tensor,它和data形状一样。

③ grad_fn: 指向一个Function对象,这个Function用来反向传播计算输入的梯度。

eg1:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
print(x)

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

eg2:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
y=x.sum()
print(y)

out:
tensor(4.)

eg3:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
y=x.sum()
y.grad_fn   #grad_fn: 指向一个Function对象,这个Function用来反向传播计算输入的梯度
print(y.grad_fn)

out:
<SumBackward0 object at 0x7f9e78230128>

eg4:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
y=x.sum()
#y=x.sum()=(x[0][0]+x[0][1]+x[1][0]+x[1][1])#每个值的梯度都为1
y.backward()#反向传播,计算梯度
x.grad   #保存data对应的梯度,grad也是一个Variable,而不是Tensor,它和data形状一样
print(x.grad)

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

note:grad在反向传播过程中是累加的,这意味着每次运行反向传播,梯度都会累加之前的梯度,所以反向传播之前需要把梯度清零。

eg:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
y=x.sum()
#y=x.sum()=(x[0][0]+x[0][1]+x[1][0]+x[1][1])#每个值的梯度都为1
y.backward()#反向传播,计算梯度
x.grad
y.backward()#反向传播,计算梯度
print(x.grad)

out:
tensor([[ 2.,  2.],
        [ 2.,  2.]])

2. 以下划线结束的函数是inplace操作

eg:

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(2,2),requires_grad=True)
y=x.sum()
#y=x.sum()=(x[0][0]+x[0][1]+x[1][0]+x[1][1])#每个值的梯度都为1
y.backward()#反向传播,计算梯度
x.grad.data.zero_()
print(x.grad.data.zero_())

out:
tensor([[ 0.,  0.],
        [ 0.,  0.]])

3.Variable 和Tensor具有几乎一致的接口,实际应用中可无缝切换。

from torch.autograd import Variable
#使用Tensor新建一个Variable
x=Variable(t.ones(4,5))
y=t.cos(x)
x_tensor_cos=t.cos(x.data)
print(y)
print(x_tensor_cos)

out:
tensor([[ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403]])
tensor([[ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403],
        [ 0.5403,  0.5403,  0.5403,  0.5403,  0.5403]])

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值