数据集和数据加载器
加载数据集
使用fashionMNIST加载数据集
import torch
from torch.utils.data import Dataset
from torchvision import datasets #使用torchvision库
from torchvision.transforms import ToTensor
import matplotlib.pyplot as plt
training_data = datasets.FashionMNIST(
root="data",
train=True,
download=True,
transform=ToTensor() #转换为张量形式
)
数据加载器
作用
数据批量处理:数据加载器将数据集分割成小批量数据,并按照指定的批量大小提供给模型。这样做的好处是可以更高效地处理大规模数据集,避免一次性加载全部数据造成内存不足或性能下降。
数据随机化和并行加载:数据加载器可以在每个 epoch(训练周期)中随机化数据顺序,以增加模型的泛化能力。此外,数据加载器还可以利用多线程并行加载数据,提高数据加载的效率。
方法
train_dataloader = DataLoader(training_data, batch_size=64)
神经网络的构建
#创建神经网络类(继承父类nn.Module)
class NeuralNetwork(nn.Module):
#定义初始化方法
def __init__(self):
#通过调用父类的_init_()方法在子类中重写init
super().__init__()
#二维展平为一维(因为全连接层只能处理一维向量)
self.flatten = nn.Flatten()
#创建序列模块nn.Sequential()包括三个线性层和两个非线性层
self.linear_relu_stack = nn.Sequential(
nn.Linear(28*28, 512),
nn.ReLU(),
nn.Linear(512, 512),
nn.ReLU(),
nn.Linear(512, 10),
)
#定义向前传播的方法
def forward(self, x):
x = self.flatten(x)
#logits为输出张量
logits = self.linear_relu_stack(x)
return logits
#创建神经网络实例
model = NeuralNetwork()
梯度追踪模块torch.autograd
概念
允许张量跟踪对其进行的所有操作,在计算完某个标量损失后自动计算相关参数的梯度。在深度学习中,我们通常有一个目标,即最小化或最大化一个称为损失函数(loss)的标量值。这个标量值是一个单一的数字,表示了模型的预测与真实值之间的差异。为了优化模型,我们需要知道如何调整模型参数才能使损失函数达到最小值或最大值。
梯度追踪就是自动计算出损失函数相对于张量的最快增长方向(梯度),在调参时选择反向传播算法,即选择损失函数最快下降的方法调参
方法
设置梯度追踪:在张量初始化时置requires_grad=true
,再调用loss.backward()
自动计算标量相对于张量的梯度。
禁止梯度追踪:requires_grad=false
/代码段前加with torch.no_grad():
需要禁止梯度追踪的情况:1、需要冻结参数时;2、加快计算速度时
保存和加载模型
保存训练好的模型参数,在新模型中加载为评估模式(进行推理阶段)
保存模型参数
torch.save(model.state_dict(), 'model_weights.pth')
#model.state_dict()保存模型字典(训练参数)
#model_weights.pth表示存储路径
加载模型
先初始化一个新模型model = models.vgg16()
,再加载参数model.load_state_dict(torch.load('model_weights.pth'))
、设置为评估模式model.eval()
评估模式
设置为评估模式可以保证模型在推理阶段的行为与在训练期间保持一致。
推理阶段是指使用训练好的模型对新的未见过的数据进行预测或分类的阶段。
目标是使用训练好的模型来产生对新数据的预测,并且通常希望模型在新数据上表现良好。
在推理阶段,不再需要调整模型的参数,因此通常会将模型设置为评估模式以确保一致的行为。