目录

一、概述

二、核心组件

2.1 Tensor

2.2 Storage

2.3 Autograd

2.4 Module

2.5 Optimizer

2.6 DataLoader

三、 PyTorch 的基本用法

3.1 基于 MNIST 数据集识别手写数字

3.2 保存和加载模型


一、概述

        PyTorch 是一个开源的机器学习库,广泛用于计算机视觉和自然语言处理等领域。以下是一个简化的 PyTorch 使用教程,不采用分点或Markdown格式。

二、核心组件

        Pytorch源码中所涉及的组件非常多,以下介绍部分常见的核心组件:

2.1 Tensor

        张量是PyTorch中的基本数据结构,类似于NumPy数组。PyTorch的大部分计算和数据操作都是基于张量进行的。

2.2 Storage

        Storage是一个底层的数据结构,它是Tensor的基础,与Tensor相比,Storage更底层,其直接负责了一个Tensor对象的内存管理。

2.3 Autograd

        Autograd是PyTorch的自动微分引擎,用于自动计算张量的梯度,并在反向传播的过程中更新计算图中张量的值,它是Pytorch中所有神经网络优化的基础。

2.4 Module

        nn.Module是PyTorch中构建神经网络的基类。通过继承nn.Module基类,可以定义自己的神经网络层、模型,并使用模块化的方式构建复杂的深度学习模型。

2.5 Optimizer

        PyTorch提供了多种优化器,用于在深度学习模型中更新和调整参数以最小化损失函数。通过将需要优化的网络参数传入优化器,便可以在每一次反向传播过后利用得到的梯度优化网络参数。

2.6 DataLoader

        在PyTorch中,DataLoader是一个用于加载数据集的实用工具,它能够自动进行数据的批处理、随机打乱数据、并行加载数据等操作,使得数据的预处理和加载变得更加高效和简单,它一般和Dataset类一起使用。

三、 PyTorch 的基本用法

        首先,确保你安装了 PyTorch。你可以通过访问 PyTorch 官网获取安装指令,根据你的系统环境(如 Windows, macOS, Linux)和是否使用 GPU 支持进行安装。安装完成后,你可以开始编写 PyTorch 代码了。

3.1 基于 MNIST 数据集识别手写数字

        这里,我们将通过一个简单的例子来展示 PyTorch 的基本用法:创建一个简单的神经网络来识别手写数字(基于 MNIST 数据集)。

import torch

import torch.nn as nn

import torch.optim as optim

from torchvision import datasets, transforms

from torch.utils.data import DataLoader

# 定义超参数

batch_size = 64

learning_rate = 0.01

epochs = 5

# 数据预处理

transform = transforms.Compose([

    transforms.ToTensor(),

    transforms.Normalize((0.5,), (0.5,))

])

# 下载和加载数据集

train_dataset = datasets.MNIST(root='./data', train=True, transform=transform, download=True)

train_loader = DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)

# 定义网络模型

class NeuralNet(nn.Module):

    def __init__(self):

        super(NeuralNet, self).__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

model = NeuralNet()

# 定义损失函数和优化器

criterion = nn.CrossEntropyLoss()

optimizer = optim.SGD(model.parameters(), lr=learning_rate)

# 训练模型

for epoch in range(epochs):

    for batch_idx, (data, target) in enumerate(train_loader):

        # 前向传播

        output = model(data)

        loss = criterion(output, target)

        # 反向传播和优化

        optimizer.zero_grad()

        loss.backward()

        optimizer.step()

        if batch_idx % 100 == 0:

            print(f'Train Epoch: {epoch} [{batch_idx * len(data)}/{len(train_loader.dataset)} ({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}')

# 注意:这里没有包括测试/验证集的加载和评估,以及模型保存和加载的代码。

# 实际应用中,你应该在训练集上训练模型,在验证集上评估模型,并保存最佳模型以便后续使用。

        以上代码展示了使用 PyTorch 进行深度学习项目的基本流程:数据预处理、模型定义、损失函数和优化器的设置、训练循环等。你可以根据自己的需求调整模型结构、超参数等。

3.2 保存和加载模型

        当然,我可以继续扩展上述的PyTorch示例,特别是加入模型评估的部分,以及在训练完成后保存和加载模型的功能。以下是扩展后的代码:

import torch

import torch.nn as nn

import torch.optim as optim

from torchvision import datasets, transforms

from torch.utils.data import DataLoader

# ... (之前的代码保持不变)

# 加载测试数据集

test_dataset = datasets.MNIST(root='./data', train=False, transform=transform, download=True)

test_loader = DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)

# 定义评估函数

def evaluate(model, data_loader):

    model.eval()  # 设置模型为评估模式

    correct = 0

    total = 0

    with torch.no_grad():  # 在评估模式下关闭梯度计算

        for data, target in data_loader:

            output = model(data)

            _, predicted = torch.max(output.data, 1)

            total += target.size(0)

            correct += (predicted == target).sum().item()

    print(f'Accuracy of the network on the {len(data_loader.dataset)} test images: {100 * correct / total} %')

# 训练模型(如果之前已经训练过,可以注释掉这部分)

# ... (之前的训练循环代码)

# 评估模型

evaluate(model, test_loader)

# 保存模型

torch.save(model.state_dict(), 'mnist_model.pth')

# 加载模型

# 注意:这里我们重新实例化模型结构,然后加载之前保存的权重

model_loaded = NeuralNet()

model_loaded.load_state_dict(torch.load('mnist_model.pth'))

model_loaded.eval()  # 确保模型在评估模式下

# 再次评估加载的模型(可选,用于验证加载的模型是否工作正常)

evaluate(model_loaded, test_loader)

        在这段代码中,我添加了一个`evaluate`函数,它接受一个模型和数据加载器作为输入,并计算模型在给定数据上的准确率。然后,我展示了如何在训练结束后保存模型的状态字典(`state_dict`),并演示了如何加载这些权重到一个新的模型实例中,以便进行进一步的评估或预测。

        请注意,在评估模型时,我们使用`model.eval()`将模型设置为评估模式,并通过`torch.no_grad()`上下文管理器来禁用梯度计算,这可以加快评估速度并减少内存消耗。在训练过程中,我们也需要确保模型处于训练模式(尽管在PyTorch中,模型默认就是训练模式,但明确调用`model.train()`可以作为一个好习惯)。然而,在上述示例中,我们并没有显式地调用`model.train()`,因为那已经是默认行为。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐