当前位置: 首页 > news >正文

Pytorch学习笔记(一)Learn the Basics - Quickstart

这个系列笔记用来记录学习pytorch的完整过程,我第一次接触pytorch已经是2018年,当时还是0.X的版本,在使用过一段时间后就完全没有再用,现在pytorch已经迭代到2.X,所以我认为有必要从头开始完整地学习一遍。与其他学习系列笔记一样,这个笔记也是紧跟官网教程。

【注意】:

  1. 这个系列笔记我会以jupyter notebook为主,因为可以更方便的看到可视化结果。但在使用jupyter的时候也要注意定shutdown kernel,否则有可能会一直占用着显存导致后面的代码无法运行的情况。
  2. 我的演示环境是 torch==2.6.0torchvision==0.17.0torchaudio==2.6.0
  3. 这个系列笔记需要你对python有一定的使用基础,并且对神经网络有一定的的了解;

以下是这篇文章涉及到资源连接:

  • 官方链接:https://pytorch.org/tutorials/beginner/basics/quickstart_tutorial.html;
完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwd=aa2m 提取码: aa2m 

Quickstart

在完成官网安装之后 Learn the Basics 的第一篇文章就是这个笔记,也是使用pytorch的第一步。


Working with data

pytorch用 torch.utils.data.DataLoadertorch.utils.data.Dataset. Dataset 作为数据处理的基本工具,其中 Dataset 实现了存储data与label的标签,DataLoader 用来将数据打包成迭代器以供 训练推理

pytorch还提供了一些特定领域的工具如 TorchTextTorchVisionTorchAudio 以提供更方便的数据加载与处理。这里以 TorchVision 为例。

Step1. 导入必要的包

import torch
from torch import nn
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor

Step2. 拉取数据集

training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor()
)

test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor()
)

Step3. 初始化DataLoader

batch_size=64

train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

for X, y in test_dataloader:
    print(f"Shape of X [N, C, H, W]: {X.shape}")
    print(f"Shape of y: {y.shape}, {y.type}")
    break

Step4. 构造模型

【注意】:如果你使用的 torch 版本不是 2.6.0 那么官网这部分的代码是不可用的,我常用的版本是 2.6.02.2.0 但是不确定在这两个版本之间的能否使用,建议手动尝试然后根据报错信息设置device:

if "2.6.0" in torch.__version__:
    device = torch.accelerator.current_accelerator().type if torch.accelerator.is_available() else "cpu"
    print(f"Using {device} device")
else:
    if torch.cuda.is_available():
        print("CUDA is available. Using GPU.")
        device = torch.device("cuda")
    else:
        print("CUDA is not available. Using CPU.")
        device = torch.device("cpu")

这里构造一个经典的全连接+Relu的多层感知机:

class NerualNetwork(nn.Module):
    def __init__(self):
        super().__init__()
        self.flatten = nn.Flatten()
        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 = self.linear_relu_stack(x)
        return logits

实例化模型并将其转移到device上

model = NerualNetwork().to(device)
print(model)

Step5. 定义损失函数、优化器、训练与测试函数

定义损失函数和优化器:

loss_fn = nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)

定义训练模型的函数:

def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    for batch, (X,y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)
        # 计算loss
        pred = model(X)
        loss = loss_fn(pred, y)
        # 反向传播给优化器
        loss.backward()
        optimizer.step()
        optimizer.zero_grad()
        
        if batch % 100 == 0:
            loss, current = loss.item(), (batch+1) * len(X)
            print(f"Loss: {loss:>7f}[{current:>5d}/{size:>5d}]")

定义测试模型的函数:

def test(dataloader, model, loss_fn):
    size = len(dataloader.dataset)
    num_batches = len(dataloader)
    model.eval()
    test_loss, correct=0, 0
    with torch.no_grad():
        for X, y in dataloader:
            X,y = X.to(device), y.to(device)
            pred = model(X)
            test_loss += loss_fn(pred, y).item()
            correct += (pred.argmax(1)==y).type(torch.float).sum().item()
    test_loss /= num_batches
    correct /= size
    print(f"Test Error:\n  Accuracy: {(100*correct):>0.1f}%, Avg loss: {test_loss:>8f}\n")

Step6. 启动训练与测试

epochs = 5
for t in range(epochs):
    print(f"Epoch {t+1}\n--------------------------")
    train(train_dataloader, model, loss_fn, optimizer)
    test(test_dataloader, model, loss_fn)
print("Done")

Step7. 保存模型参数到本地

torch.save(model.state_dict(), "model.pth")
print("Saved PyTorch Model state to model.pth")

Step8. 从本地加载模型参数

model = NeuralNetwork().to(device)
model.load_state_dict(torch.load("model.pth", weights_only=True))
print(model)

Step9. 用加载进来的参数推理

将离散数字映射为文字的列表:

classes = [
    "T-shirt/top",
    "Trouser",
    "Pullover",
    "Dress",
    "Coat",
    "Sandal",
    "Shirt",
    "Sneaker",
    "Bag",
    "Ankle boot",
]

执行推理:

model.eval()
x,y = test_data[0][0], test_data[0][1]
with torch.no_grad():
    x = x.to(device)
    pred = model(x)
    predicted, actual = classes[pred[0].argmax(0)], classes[y]
    print(f"Predicted: {predicted}, Actual: {actual}")

在这里插入图片描述

相关文章:

  • 辉视智慧会所:一键“唤”醒高端服务,乐享智慧生活新“声”级!
  • 动态规划 力扣hot100热门面试算法题 面试基础 核心思路 背题
  • 2024Android高频精选面试题讲解,程序人生
  • 协作机械臂需要加安全墙吗? 安全墙 光栅 干涉区
  • docker安装hyperf环境,连接本机redis问题处理
  • 9.4分漏洞!Next.js Middleware鉴权绕过漏洞安全风险通告
  • 多Agent系统,其中用户可以 自由选择不同Agent
  • redis与数据库双写一致性解决方案
  • pyqt SQL Server 数据库查询-优化
  • Vite管理的Vue3项目中monaco editer的使用以及组件封装
  • [Vue]事件修饰符
  • 7-2 sdut-C语言实验-逆序建立链表
  • HarmonyOS人脸比对技术自学指南与实战分享
  • MATLAB代码丨信号处理:对Python中Librosa库部分函数的重现
  • 命令执行GetShell
  • 【PGCCC】PostgreSQL Certified Master 个人专访 | 第二期 何雄
  • Linux使用集群服务器查看已安装conda环境,且环境名无显示、系统环境混乱等问题
  • 如何在 Linux 上安装并运行 Postman?
  • Vue 中如何使用 v-model 实现自定义组件的双向绑定?
  • 【深度学习新浪潮】展平RVQ技术详解
  • 做网站很挣多少钱/广告代理商
  • 韩国吃秀在哪个网站做直播/百度收录
  • wordpress json api/草根seo视频大全
  • 学做网站根学ps有前途吗/厦门网
  • 会员管理系统免费版官方下载/抖音关键词优化排名
  • 大连手机自适应网站建设价格/看颜色应该搜索哪些词汇