一、Tensor用于自动求梯度
"tensor"这个单词⼀般可译作“张量”,张量可以看作是⼀个多维数组。标量可以看作是0维张量,向量可以看作1维张量,矩阵可以看作是⼆维张量。
在深度学习中,我们经常需要对函数求梯度(gradient)。PyTorch提供的autograd
包能够根据输⼊和前向传播过程⾃动构建计算图,并执⾏反向传播。本节将介绍如何使⽤autograd包来进⾏⾃动求梯度的有关操作。
概念
Pytorch中的Tensor
是这个包的核⼼类,如果将其属性 .requires_grad
设置为 True
,它将开始追踪(track)在其上的所有操作(这样就可以利⽤链式法则进⾏梯度传播了)。完成计算后,可以调⽤ .backward()
来完成所有梯度计算。此 Tensor
的梯度将累积到 .grad
属性中。
注意在
y.backward()
时,如果y
是标量,则不需要为backward()
传⼊任何参数;否则,需要传⼊⼀个与y
同形的Tensor
。
如果不想要被继续追踪,可以调⽤ .detach()
将其从追踪记录中分离出来,这样就可以防⽌将来的计算被追踪,这样梯度就传不过去了。此外,还可以⽤ with torch.no_grad()
将不想被追踪的操作代码块包裹起来,这种⽅法在评估模型的时候很常⽤,因为在评估模型时,我们并不需要计算可训练参数(requires_grad=True
)的梯度。
Function
是另外⼀个很᯿要的类。 Tensor
和 Function
互相结合就可以构建⼀个记录有整个计算过程的有向⽆环图(DAG)。每个 Tensor 都有⼀个 .grad_fn
属性,该属性即创建该 Tensor
的Function
, 就是说该 Tensor
是不是通过某些运算得到的,若是,则 grad_fn
返回⼀个与这些运算相关的对象,否则是None。
import torch
# 通过设置`requires_grad=Ytue`,使得操作通过链式法则进行梯度传播
x = torch.ones(2, 2, requires_grad=True)
print(x)
print(x.grad_fn)
+的运算操作
y = x+2
print(y)
print(y.grad_fn)
print(x.is_leaf,y.is_leaf)
# 复杂一点的运算操作
z = y*y*2
print(z)
print(z.grad_fn)
out = z.mean()
print(z, out)
输出结果: