pytorch基础教学简单实例(附代码)

目录

1.简介 

2.数据集

3.模型初始化

4.训练参数

5.训练&验证

6.保存&加载模型


1.简介 

这篇文章主要是针对刚入门pytorch的小伙伴,会带大家完整走一遍使用神经网络训练的流程,以及介绍一些pytorch常用的函数。如果还未安装pytorch或者安装有困难,可以参考我的上一篇文章:

Windows Anaconda精简安装cuda+pytorch+torchvision


2.数据集

这里使用的是FashionMNIST,因为可以直接调用pytorch里的代码下载比较方便。加载代码如下:

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

# ----------数据集----------

# 加载MNIST数据集的训练集
training_data = datasets.FashionMNIST(
    root="data",
    train=True,
    download=True,
    transform=ToTensor(),
)
# 加载MNIST数据集的测试集
test_data = datasets.FashionMNIST(
    root="data",
    train=False,
    download=True,
    transform=ToTensor(),
)

# batch大小
batch_size = 64

# 创建dataloader
train_dataloader = DataLoader(training_data, batch_size=batch_size)
test_dataloader = DataLoader(test_data, batch_size=batch_size)

# 遍历dataloader
for X, y in test_dataloader:
    print("Shape of X [N, C, H, W]: ", X.shape)     # 每个batch数据的形状
    print("Shape of y: ", y.shape)                  # 每个batch标签的形状
    break


3.模型初始化

手动搭建了两个全连接层的神经网络结构。代码如下:


# ----------模型----------
# 定义模型
class NeuralNetwork(nn.Module):
    def __init__(self):     # 初始化,实例化模型的时候就会调用
        super(NeuralNetwork, self).__init__()
        self.flatten = nn.Flatten()     # [64, 1, 28, 28] -> [64, 1*28*28]
        self.linear_relu_stack = nn.Sequential(
            nn.Linear(28*28, 512),      # [64, 1*28*28] -> [64, 512]
            nn.ReLU(),
            nn.Linear(512, 512),        # [64, 512] -> [64, 512]
            nn.ReLU(),
            nn.Linear(512, 10)          # [64, 512] -> [64, 10]
        )

    def forward(self, x):   # 前向传播,输入数据进网络的时候才会调用
        x = self.flatten(x)                     # [64, 1*28*28]
        logits = self.linear_relu_stack(x)      # [64, 10]
        return logits

# 使用gpu或者cpu进行训练
device = "cuda" if torch.cuda.is_available() else "cpu"
# 打印使用的是gpu/cpu
print("Using {} device".format(device))
# 实例化模型
model = NeuralNetwork().to(device)
# 打印模型结构
print(model)

4.训练参数

损失函数用来计算预测输出和真实输出的差值,优化器用来更新网络的权重参数,scheduler用来调整训练过程中的学习率。代码如下:

# ----------训练参数设置----------
loss_fn = nn.CrossEntropyLoss()                             # 损失函数设置
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3)    # 学习率设置
epochs = 5                                                  # 训练迭代次数设置

5.训练&验证

训练和测试的步骤可以总结为下图,具体代码如下:


# 训练函数
def train(train_dataloader, model, loss_fn, optimizer):
    """
        训练网络

        输入:
            train_dataloader:   训练集的dataloader
            model:              网络模型
            loss_fn:            损失函数
            optimizer:          优化器
        """
    # 切换到train模式
    model.train()
    # 遍历dataloader
    for images, labels in train_dataloader:
        # 将数据和标签加载到device上
        images, labels = images.to(device), labels.to(device)
        # 输入数据到模型里得到输出
        pred = model(images)
        # 计算输出和标签的loss
        loss = loss_fn(pred, labels)
        # 反向推导
        optimizer.zero_grad()
        loss.backward()
        # 步进优化器
        optimizer.step()


# 测试函数
def test(test_dataloader, model, loss_fn):
    """
        测试网络

        输入:
            test_dataloader:    测试集的dataloader
            model:              网络模型
            loss_fn:            损失函数
        """
    # 测试集大小
    size = len(test_dataloader.dataset)
    # 测试集的batch数量
    num_batches = len(test_dataloader)
    # 切换到测试模型
    model.eval()
    # 记录loss和准确率
    test_loss, correct = 0, 0
    # 梯度截断
    with torch.no_grad():
        for images, labels in test_dataloader:  # 遍历batch
            # 加载到device
            images, labels = images.to(device), labels.to(device)
            # 输入数据到模型里得到输出
            pred = model(images)
            # 累加loss
            test_loss += loss_fn(pred, labels).item()
            # 累加正确率
            correct += (pred.argmax(1) == labels).sum().item()
    # 计算平均loss和准确率
    test_loss /= num_batches
    correct /= size
    print(f"Test Error: \n Accuracy: {(100 * correct):>0.1f}%, Avg loss: {test_loss:>8f} \n")

6.保存&加载模型

在训练好网络后,我们可以将训练好的权重保存下来,这样下次要使用的时候就不用再次训练,直接加载就好,代码如下:

# 保存模型
torch.save(model.state_dict(), "model.pth")
# 加载模型
model = NeuralNetwork()
model.load_state_dict(torch.load("model.pth"))

业务合作/学习交流+v:lizhiTechnology

如果想要了解更多深度学习相关知识,可以参考我的其他文章:

【优化器】(一) SGD原理 & pytorch代码解析_sgd优化器-CSDN博客

【损失函数】(一) L1Loss原理 & pytorch代码解析_l1 loss-CSDN博客

【图像生成】(一) DNN 原理 & pytorch代码实例_pytorch dnn代码-CSDN博客

深度学习_Lcm_Tech的博客-CSDN博客

  • 21
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值