载入数据集
以下是一个从TorchVision加载Fashion-MNIST数据集的例子。
将使用以下参数加载Fashion-MNIST数据集:
- root 数据集(训练/测试)数据集存储目录
- train 指定训练集还是测试集
- download=True 如果root中没有数据集时进行下载
- transform and target_transform指定特征和标签的转换操作,其中transform用于对输入的图像数据进行预处理或增强操作,target_transform参数用于对标签进行转换操作,例如将标签进行编码或者进行其他预处理。
import torch
from torch.utils.data import Dataset
from torchvision import datasets
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
training_data = datasets.FashionMNIST(
root="data",
train=True, # 这里表示加载训练集
download=True,
transform=ToTensor()
)
test_data = datasets.FashionMNIST(
root="data",
train=False, # 这里表示不加载训练集
download=True,
transform=ToTensor()
)
Autograd:自动求导
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
互相连接生成了一个无圈图(acyclic graph),它编码了完整的计算历史。每个张量都有一个.grad_fn
属性,该属性引用了创建Tensor
自身的Function
(除非这个张量是用户手动创建的,即这个张量的grad_fn
是None
)。
如果需要计算导数,可以在Tensor
上调用.backward()
。如果Tensor
是一个标量(即它包含一个元素的数据),则不需要为backward()
指定任何参数,但是如果它有更多的元素,则需要指定一个gradient
参数,该参数是形状匹配的张量。