0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

PyTorch的介绍与使用案例

CHANBAEK 来源:网络整理 2024-07-10 14:19 次阅读

PyTorch简介

PyTorch是一个基于Python的开源机器学习库,它主要面向深度学习和科学计算领域。PyTorch由Meta Platforms(原Facebook)的人工智能研究团队开发,并逐渐发展成为深度学习领域的一个重要工具。PyTorch底层由C++实现,提供了丰富的API接口,使得开发者能够高效地构建和训练神经网络模型。PyTorch不仅支持动态计算图,还提供了强大的自动微分系统,极大地简化了深度学习任务的开发流程。

主要特点

  1. 动态计算图 :PyTorch使用动态计算图,与TensorFlow等使用静态计算图的框架不同,这使得PyTorch在编写和调试神经网络时更加灵活和直观。
  2. 丰富的库和工具 :PyTorch提供了大量的预训练模型和工具,支持各种神经网络结构,包括卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等。
  3. 易用性 :PyTorch的API设计简洁直观,易于上手,同时支持GPU加速,能够充分利用硬件资源提高计算效率。
  4. 社区支持 :PyTorch拥有庞大的社区支持,开发者可以轻松地找到各种资源和解决方案。

安装

PyTorch的安装非常简单,可以通过pip命令直接安装。例如,在命令行中运行以下命令即可安装PyTorch及其常用子库torchvision(用于图像处理和数据加载):

pip install torch torchvision

PyTorch的基本使用

张量(Tensor)

在PyTorch中,张量(Tensor)是核心的数据结构,用于存储和操作多维数组。张量类似于NumPy的ndarray,但可以在GPU上运行,以加速计算。

import torch  
  
# 创建一个5x3的未初始化的张量  
x = torch.empty(5, 3)  
print(x)  
  
# 创建一个已初始化为零的5x3张量  
x = torch.zeros(5, 3)  
print(x)  
  
# 创建一个形状为5x3的张量,并用随机数填充  
x = torch.randn(5, 3)  
print(x)

自动微分(Autograd)

PyTorch的自动微分系统能够自动计算张量上所有操作的梯度。这对于神经网络的训练至关重要。通过设置requires_grad=True,PyTorch会追踪对该张量的所有操作,并在需要时计算梯度。

import torch  
  
# 创建一个张量并设置requires_grad=True来追踪其计算历史  
x = torch.ones(2, 2, requires_grad=True)  
y = x + 2  
z = y * y * 3  
out = z.mean()  
  
# 对out进行反向传播,计算梯度  
out.backward()  
print(x.grad)  # 输出x的梯度

神经网络模块

PyTorch的torch.nn模块提供了构建神经网络的构建块。通过继承nn.Module类,可以定义自己的神经网络结构。

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
class Net(nn.Module):  
    def __init__(self):  
        super(Net, self).__init__()  
        self.conv1 = nn.Conv2d(1, 6, 3)  
        self.conv2 = nn.Conv2d(6, 16, 3)  
        self.fc1 = nn.Linear(16 * 6 * 6, 120)  
        self.fc2 = nn.Linear(120, 84)  
        self.fc3 = nn.Linear(84, 10)  
  
    def forward(self, x):  
        x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))  
        x = F.max_pool2d(F.relu(self.conv2(x)), 2)  
        x = x.view(-1, self.num_flat_features(x))  
        x = F.relu(self.fc1(x))  
        x = F.relu(self.fc2(x))  
        x = self.fc3(x)  
        return x  
  
    def num_flat_features(self, x):  
        size = x.size()[1:]  # 获取所有维度的大小,除了批处理维度  
        num_features = 1  
        for s in size:  
            num_features *= s  
        return num_features

PyTorch的使用案例

图像处理

PyTorch在图像处理领域有着广泛的应用,例如图像分类、目标检测、图像分割等。以下是一个使用PyTorch进行图像分类的简单案例。

图像分类案例

在这个案例中,我们将使用PyTorch来训练一个基本的卷积神经网络(CNN),用于对CIFAR-10数据集进行分类。CIFAR-10是一个包含60000张32x32彩色图像的数据集,分为10个类别,每个类别有6000张图像。

1. 数据加载与预处理

首先,我们需要从PyTorch的torchvision模块中加载CIFAR-10数据集,并进行必要的预处理。

import torch  
import torchvision  
import torchvision.transforms as transforms  
  
# 数据预处理  
transform = transforms.Compose([  
    transforms.ToTensor(),  # 将图片转换为Tensor  
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  # 归一化  
])  
  
# 加载训练集和测试集  
trainset = torchvision.datasets.CIFAR10(root='./data', train=True,  
                                        download=True, transform=transform)  
trainloader = torch.utils.data.DataLoader(trainset, batch_size=4,  
                                          shuffle=True, num_workers=2)  
  
testset = torchvision.datasets.CIFAR10(root='./data', train=False,  
                                       download=True, transform=transform)  
testloader = torch.utils.data.DataLoader(testset, batch_size=4,  
                                         shuffle=False, num_workers=2)  
  
classes = ('plane', 'car', 'bird', 'cat',  
           'deer', 'dog', 'frog', 'horse', 'ship', 'truck')

2. 定义网络模型

接下来,我们定义一个简单的CNN模型,用于处理CIFAR-10的图像数据。

import torch.nn as nn  
import torch.nn.functional as F  
  
class Net(nn.Module):  
    def __init__(self):  
        super(Net, self).__init__()  
        self.conv1 = nn.Conv2d(3, 6, 5)  
        self.pool = nn.MaxPool2d(2, 2)  
        self.conv2 = nn.Conv2d(6, 16, 5)  
        self.fc1 = nn.Linear(16 * 5 * 5, 120)  
        self.fc2 = nn.Linear(120, 84)  
        self.fc3 = nn.Linear(84, 10)  
  
    def forward(self, x):  
        x = self.pool(F.relu(self.conv1(x)))  
        x = self.pool(F.relu(self.conv2(x)))  
        x = x.view(-1, 16 * 5 * 5)  
        x = F.relu(self.fc1(x))  
        x = F.relu(self.fc2(x))  
        x = self.fc3(x)  
        return x  
  
net = Net()

3. 损失函数与优化器

选择适当的损失函数(如交叉熵损失)和优化器(如SGD或Adam)。

import torch.optim as optim  
  
criterion = nn.CrossEntropyLoss()  
optimizer = optim.SGD(net.parameters(), lr=0.001, momentum=0.9)

4. 训练网络

训练网络通常涉及多个epoch的迭代,每个epoch中遍历整个数据集一次。

for epoch in range(10):  # 遍历数据集多次  
  
    running_loss = 0.0  
    for i, data in enumerate(trainloader, 0):  
        # 获取输入  
        inputs, labels = data  
  
        # 梯度置零  
        optimizer.zero_grad()  
  
        # 前向 + 反向 + 优化  
        outputs = net(inputs)  
        loss = criterion(outputs, labels)  
        loss.backward()  
        optimizer.step()  
  
        # 打印统计信息  
        running_loss += loss.item()  
        if i % 2000 == 1999:    # 每2000个mini-batches打印一次  
            print(f'[{epoch + 1}, {i + 1:5d}] loss: {running_loss / 2000:.3f}')  
            running loss = 0.0
print(f'Finished Epoch {epoch+1}, Loss: {running_loss/len(trainloader):.3f}')

5. 测试网络

在测试集上评估网络的性能,确保模型在未见过的数据上也能表现良好。

correct = 0  
total = 0  
with torch.no_grad():  
    for data in testloader:  
        images, labels = data  
        outputs = net(images)  
        _, predicted = torch.max(outputs.data, 1)  
        total += labels.size(0)  
        correct += (predicted == labels).sum().item()  
  
print(f'Accuracy of the network on the 10000 test images: {100 * correct / total}%')

6. 保存模型

在训练完成后,你可能希望保存模型以便将来使用或进一步分析。

torch.save(net.state_dict(), 'cifar_net.pth')

7. 加载模型进行预测

当你需要再次使用模型进行预测时,可以加载保存的模型状态。

net = Net()  
net.load_state_dict(torch.load('cifar_net.pth'))  
  
# 假设你有一个新的图像输入  
# 你可以使用相同的transform来处理这个新图像,然后将其送入网络进行预测  
  
# 示例:仅用于说明,需要替换为实际的图像数据  
example_input = torch.randn(1, 3, 32, 32)  # 假设的新图像输入,需要是tensor格式  
example_input = example_input.to(device)  # 假设你有一个device设置  
  
# 前向传播  
output = net(example_input)  
_, predicted = torch.max(output, 1)  
print(f'Predicted class: {classes[predicted.item()]}')

注意

  • 在实际使用中,你可能需要处理更复杂的模型结构、更多的数据增强技术、正则化方法、学习率调整策略等。
  • 此外,使用GPU可以显著提高训练速度。你可以通过设置device = torch.device("cuda:0" if torch.cuda.is_available() else "cpu")并在需要将数据或模型移至GPU时使用.to(device)来实现这一点。
  • 在进行模型评估时,记得将模型设置为评估模式(net.eval()),这可以关闭某些层的dropout和batch normalization的行为,确保模型在评估时表现一致。
  • 考虑到CIFAR-10数据集的大小和复杂性,上述模型可能不是最优的。你可以尝试使用更深的网络结构,如ResNet、VGG等,以获得更好的性能。
    当然,让我们继续深入探讨一些在实际应用中可能会遇到的额外步骤和考虑因素。

8. 模型评估与验证

在训练过程中,除了最终的测试集评估外,使用验证集(validation set)来监控模型的性能是非常重要的。验证集是从训练数据中分离出来的一部分,用于在训练过程中调整超参数(如学习率、批量大小、网络架构等),而不直接参与模型的训练。

# 假设你已经有了trainloader, validloader, testloader  
best_acc = 0.0  
for epoch in range(num_epochs):  
    # 训练阶段...  
      
    # 验证阶段  
    net.eval()  # 设置为评估模式  
    valid_loss = 0.0  
    correct = 0  
    total = 0  
    with torch.no_grad():  
        for data in validloader:  
            images, labels = data  
            outputs = net(images)  
            loss = criterion(outputs, labels)  
            valid_loss += loss.item()  
            _, predicted = torch.max(outputs.data, 1)  
            total += labels.size(0)  
            correct += (predicted == labels).sum().item()  
  
    valid_loss /= len(validloader)  
    valid_acc = 100 * correct / total  
      
    # 保存最佳模型  
    if valid_acc > best_acc:  
        best_acc = valid_acc  
        torch.save(net.state_dict(), 'best_cifar_net.pth')  
      
    print(f'Epoch {epoch+1}, Validation Loss: {valid_loss:.4f}, Validation Accuracy: {valid_acc:.2f}%')  
      
    net.train()  # 回到训练模式  
  
# 加载最佳模型进行评估  
net.load_state_dict(torch.load('best_cifar_net.pth'))  
# 进行测试集评估...

9. 超参数调优

参数调优是深度学习中的一个重要步骤,它涉及调整模型训练过程中的各种参数,如学习率、批量大小、权重衰减(正则化参数)、训练轮次(epochs)等,以获得最佳的模型性能。这通常通过交叉验证或网格搜索等方法来完成。

10. 数据增强

数据增强是一种通过增加训练数据的多样性来提高模型泛化能力的技术。对于图像数据,这可以包括随机裁剪、旋转、翻转、调整亮度和对比度等操作。

transform_train = transforms.Compose([  
    transforms.RandomCrop(32, padding=4),  
    transforms.RandomHorizontalFlip(),  
    transforms.ToTensor(),  
    transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5))  
])  
  
# 加载训练集时使用transform_train

11. 模型集成

模型集成是一种通过组合多个模型的预测结果来提高整体性能的技术。这可以通过简单的平均、投票、堆叠(Stacking)等方法来实现。

12. 部署模型

训练好的模型最终需要被部署到实际应用中。这通常涉及将模型转换为适合部署的格式(如ONNX、TorchScript等),并将其集成到应用程序或服务中。

13. 监控与维护

部署后的模型需要持续监控其性能,并根据需要进行更新或重新训练。这包括监控模型的准确性、响应时间和资源使用情况,以及处理新出现的数据偏差或概念漂移等问题。

通过这些步骤,你可以构建一个健壮的图像分类系统,并将其成功部署到实际应用中。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 机器学习
    +关注

    关注

    66

    文章

    8304

    浏览量

    131809
  • python
    +关注

    关注

    53

    文章

    4752

    浏览量

    84044
  • pytorch
    +关注

    关注

    2

    文章

    794

    浏览量

    13002
收藏 人收藏

    评论

    相关推荐

    Pytorch模型训练实用PDF教程【中文】

    PyTorch 提供的数据增强方法(22 个)、权值初始化方法(10 个)、损失函数(17 个)、优化器(6 个)及 tensorboardX 的方法(13 个)进行了详细介绍。本教程分为四章
    发表于 12-21 09:18

    Pytorch自动求导示例

    Pytorch自动微分的几个例子
    发表于 08-09 11:56

    Pytorch入门之的基本操作

    Pytorch入门之基本操作
    发表于 05-22 17:15

    PyTorch如何入门

    PyTorch 入门实战(一)——Tensor
    发表于 06-01 09:58

    PyTorch10的基础教程

    PyTorch 10 基础教程(4):训练分类器
    发表于 06-05 17:42

    Pytorch AI语音助手

    想做一个Pytorch AI语音助手,有没有好的思路呀?
    发表于 03-06 13:00

    如何安装TensorFlow2 Pytorch

    如何安装TensorFlow2 Pytorch
    发表于 03-07 07:32

    通过Cortex来非常方便的部署PyTorch模型

    到软件中。如何从“跨语言语言模型”转换为谷歌翻译?在这篇博客文章中,我们将了解在生产环境中使用 PyTorch 模型意味着什么,然后介绍一种允许部署任何 PyTorch 模型以便在软件中使用的方法。在生
    发表于 11-01 15:25

    如何往星光2板子里装pytorch

    如题,想先gpu版本的pytorch只安装cpu版本的pytorch,pytorch官网提供了基于conda和pip两种安装方式。因为咱是risc架构没对应的conda,而使用pip安装提示也没有
    发表于 09-12 06:30

    一篇非常新的介绍PyTorch内部机制的文章

    译者序:这篇博文是一篇非常新的介绍PyTorch内部机制的文章,作者Edward Z Yang来自于Stanford大学,是PyTorch的核心开发者之一。文章中介绍了如何阅读
    的头像 发表于 12-26 10:17 2045次阅读
    一篇非常新的<b class='flag-5'>介绍</b><b class='flag-5'>PyTorch</b>内部机制的文章

    基于PyTorch的深度学习入门教程之PyTorch简单知识

    本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。 Part1:PyTorc
    的头像 发表于 02-16 15:20 2138次阅读

    基于PyTorch的深度学习入门教程之PyTorch的自动梯度计算

    本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。 Part1:PyTorc
    的头像 发表于 02-16 15:26 1910次阅读

    基于PyTorch的深度学习入门教程之使用PyTorch构建一个神经网络

            前言 本文参考PyTorch官网的教程,分为五个基本模块来介绍PyTorch。为了避免文章过长,这五个模块分别在五篇博文中介绍。 Part1:
    的头像 发表于 02-15 09:40 1991次阅读

    深度学习框架pytorch介绍

    深度学习框架pytorch介绍 PyTorch是由Facebook创建的开源机器学习框架,其中TensorFlow是完全基于数据流图的。它是一个使用动态计算图的框架,允许用户更灵活地定义和修改模型
    的头像 发表于 08-17 16:10 1518次阅读

    tensorflow和pytorch哪个更简单?

    工业界广泛使用、具有丰富生态系统和跨平台支持的框架,TensorFlow可能更适合您。以下是tensorflow和pytorch介绍: TensorFlow和PyTorch的基本概念
    的头像 发表于 07-05 09:45 355次阅读