PyTorch中,所有神经网络的核心是autograd
包。先简单介绍一下这个包,然后训练我们的第一个的神经网络。
autograd
包为张量上的所有操作提供了自动求导机制。它是一个在运行时定义(define-by-run)的框架,这意味着反向传播是根据代码如何运行来决定的,并且每次迭代可以是不同的.
让我们用一些简单的例子来看看吧。
torch.Tensor
是这个包的核心类。如果设置它的属性 .requires_grad
为True
,那么它将会追踪对于该张量的所有操作。当完成计算后可以通过调用.backward()
,来自动计算所有的梯度。这个张量的所有梯度将会自动累加到.grad
属性.
要阻止一个张量被跟踪历史,可以调用.detach()
方法将其与计算历史分离,并阻止它未来的计算记录被跟踪。
为了防止跟踪历史记录(和使用内存),可以将代码块包装在with torch.no_grad():
中。在评估模型时特别有用,因为模型可能具有requires_grad = True
的可训练的参数,但是我们不需要在此过程中对他们进行梯度计算。
还有一个类对于autograd的实现非常重要:Function
。
Tensor
和Function
互相连接生成了一个非循环图,它编码了完整的计算历史。每个张量都有一个.grad_fn
属性,它引用了一个创建了这个Tensor
的Function
(除非这个张量是用户手动创建的,即这个张量的grad_fn
是None
)。
如果需要计算导数,可以在Tensor
上调用.backward()
。如果Tensor
是一个标量(即它包含一个元素的数据),则不需要为backward()
指定任何参数,但是如果它有更多的元素,则需要指定一个gradient
参数,它是形状匹配的张量。
import torch
创建一个张量并设置requires_grad=True
用来追踪其计算历史