pytorch升级打怪(一)

学习基础知识

机器学习的基本流程

  • 数据处理
  • 创建模型
  • 优化模型参数
  • 保存训练的模型

快速入门

一个简单的目标分类任务

识别衣服的类型

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


# Define model
class NeuralNetwork(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


def train(dataloader, model, loss_fn, optimizer):
    size = len(dataloader.dataset)
    model.train()
    for batch, (X, y) in enumerate(dataloader):
        X, y = X.to(device), y.to(device)

        # Compute prediction error
        pred = model(X)
        loss = loss_fn(pred, y)

        # Backpropagation
        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")


if __name__ == "__main__":
    # 处理数据
    # Download training data from open datasets.
    training_data = datasets.FashionMNIST(
        root="data",
        train=True,
        download=True,
        transform=ToTensor(),
    )

    # Download test data from open datasets.
    test_data = datasets.FashionMNIST(
        root="data",
        train=False,
        download=True,
        transform=ToTensor(),
    )

    batch_size = 64

    # Create data loaders.
    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.dtype}")
        break

    # 创建模型
    # Get cpu, gpu or mps device for training.
    device = (
        "cuda"
        if torch.cuda.is_available()
        else "mps"
        if torch.backends.mps.is_available()
        else "cpu"
    )
    print(f"Using {device} device")
    model = NeuralNetwork().to(device)
    print(model)

    # 优化模型参数
    # 损失函数
    loss_fn = nn.CrossEntropyLoss()
    # 优化器
    optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)
    epochs = 20
    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!")

    # 保存模型
    torch.save(model.state_dict(), "model.pth")
    print("Saved PyTorch Model State to model.pth")

    # 加载模型
    model = NeuralNetwork().to(device)
    model.load_state_dict(torch.load("model.pth"))

    # 使用训练的模型进行预测
    """
    “t恤/顶”,
    “裤子”,
    “套衫”,
    “衣服”,
    “外套”,
    “凉鞋”,
    “衬衫”,
    “运动鞋”,
    “包”,
    “踝靴”,
    """
    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}"')

执行过程


/Users/futuredeng/anaconda3/envs/pyspide6_study/bin/python -X pycache_prefix=/Users/futuredeng/Library/Caches/JetBrains/PyCharm2024.1/cpython-cache /Applications/PyCharm.app/Contents/plugins/python/helpers/pydev/pydevd.py --multiprocess --qt-support=auto --client 127.0.0.1 --port 52646 --file /Users/futuredeng/PycharmProjects/pyspide6_study/s_torch/demo.py 
已连接到 pydev 调试器(内部版本号 241.14494.19)Shape of X [N, C, H, W]: torch.Size([64, 1, 28, 28])
Shape of y: torch.Size([64]) torch.int64
Using mps device
NeuralNetwork(
  (flatten): Flatten(start_dim=1, end_dim=-1)
  (linear_relu_stack): Sequential(
    (0): Linear(in_features=784, out_features=512, bias=True)
    (1): ReLU()
    (2): Linear(in_features=512, out_features=512, bias=True)
    (3): ReLU()
    (4): Linear(in_features=512, out_features=10, bias=True)
  )
)
Epoch 1
-------------------------------
loss: 2.298847  [   64/60000]
loss: 2.291248  [ 6464/60000]
loss: 2.278691  [12864/60000]
loss: 2.270169  [19264/60000]
loss: 2.247777  [25664/60000]
loss: 2.226532  [32064/60000]
loss: 2.221170  [38464/60000]
loss: 2.191688  [44864/60000]
loss: 2.186391  [51264/60000]
loss: 2.159593  [57664/60000]
Test Error: 
 Accuracy: 48.9%, Avg loss: 2.151264 

Epoch 2
-------------------------------
loss: 2.160394  [   64/60000]
loss: 2.149280  [ 6464/60000]
loss: 2.097811  [12864/60000]
loss: 2.111865  [19264/60000]
loss: 2.052902  [25664/60000]
loss: 2.002435  [32064/60000]
loss: 2.016076  [38464/60000]
loss: 1.941067  [44864/60000]
loss: 1.946122  [51264/60000]
loss: 1.868463  [57664/60000]
Test Error: 
 Accuracy: 58.9%, Avg loss: 1.870417 

Epoch 3
-------------------------------
loss: 1.907855  [   64/60000]
loss: 1.873430  [ 6464/60000]
loss: 1.759730  [12864/60000]
loss: 1.795776  [19264/60000]
loss: 1.683292  [25664/60000]
loss: 1.641434  [32064/60000]
loss: 1.654433  [38464/60000]
loss: 1.561658  [44864/60000]
loss: 1.587600  [51264/60000]
loss: 1.478837  [57664/60000]
Test Error: 
 Accuracy: 60.4%, Avg loss: 1.501103 

Epoch 4
-------------------------------
loss: 1.573581  [   64/60000]
loss: 1.536037  [ 6464/60000]
loss: 1.387229  [12864/60000]
loss: 1.457505  [19264/60000]
loss: 1.340816  [25664/60000]
loss: 1.339017  [32064/60000]
loss: 1.352573  [38464/60000]
loss: 1.279530  [44864/60000]
loss: 1.314921  [51264/60000]
loss: 1.217413  [57664/60000]
Test Error: 
 Accuracy: 63.3%, Avg loss: 1.242960 

Epoch 5
-------------------------------
loss: 1.320792  [   64/60000]
loss: 1.301409  [ 6464/60000]
loss: 1.135017  [12864/60000]
loss: 1.243455  [19264/60000]
loss: 1.120873  [25664/60000]
loss: 1.144230  [32064/60000]
loss: 1.168045  [38464/60000]
loss: 1.104519  [44864/60000]
loss: 1.145055  [51264/60000]
loss: 1.060252  [57664/60000]
Test Error: 
 Accuracy: 64.9%, Avg loss: 1.082238 

Done!
Saved PyTorch Model State to model.pth
Predicted: "Ankle boot", Actual: "Ankle boot"

进程已结束,退出代码为 0

相关推荐

  1. pytorch升级

    2024-03-10 16:16:06       22 阅读
  2. pytorch升级(二)

    2024-03-10 16:16:06       16 阅读
  3. pytorch升级(八)

    2024-03-10 16:16:06       17 阅读
  4. pytorch升级(四)

    2024-03-10 16:16:06       19 阅读
  5. pytorch升级(七)

    2024-03-10 16:16:06       17 阅读
  6. pytorch升级(五)

    2024-03-10 16:16:06       18 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-10 16:16:06       14 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-10 16:16:06       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-10 16:16:06       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-10 16:16:06       18 阅读

热门阅读

  1. 力扣77-组合

    2024-03-10 16:16:06       23 阅读
  2. 设计模式之单例模式

    2024-03-10 16:16:06       20 阅读
  3. IntelliJ IDEA分支svn

    2024-03-10 16:16:06       26 阅读
  4. Linux运维_Bash脚本_编译安装GTK+-3.24.41

    2024-03-10 16:16:06       23 阅读
  5. Windows中毒应急方式

    2024-03-10 16:16:06       17 阅读
  6. c#开发100问?

    2024-03-10 16:16:06       22 阅读
  7. 初识C语言—结构体

    2024-03-10 16:16:06       21 阅读
  8. 教你用Android Studio如何打jar包与aar包

    2024-03-10 16:16:06       18 阅读