探索 Python 库:PyTorch

发布日期:2026-07-08 08:58:06   来源 : 杭州电子商务研究院    浏览量 :10
杭州电子商务研究院 发布日期:2026-07-08 08:58:06  
10

介绍

深度学习是机器学习和人工智能领域最热门的话题之一。本指南将向您介绍 PyTorch,这是 Facebook 推出的一款热门深度学习库。PyTorch 与 Google 推出的 TensorFlow 并列。PyTorch 和 TensorFlow 都有一个共同的目标:使用神经网络训练机器学习模型。但 PyTorch 为深度学习提供了一个 Pythonic 接口,而 TensorFlow 则非常低级,需要用户了解很多有关神经网络内部的知识。最近,Keras 项目成为 TensorFlow 的一部分,PyTorch 中的一些便利功能也可供 TensorFlow 用户使用。然而,Keras 的级别甚至比 PyTorch 更高。对于许多用户来说,PyTorch 可能是灵活性和快速开发之间训练机器学习模型的理想折衷方案。

PyTorch 中的网络

PyTorch 中的神经网络是一个继承自torch.nn.Module的类。网络的层在类初始化器中声明。

      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, 32, 3, 1)
        self.conv2 = nn.Conv2d(32, 64, 3, 1)
        self.dropout1 = nn.Dropout2d(0.25)
        self.dropout2 = nn.Dropout2d(0.5)
        self.fc1 = nn.Linear(9216, 128)
        self.fc2 = nn.Linear(128, 10)
    

这是来自 PyTorch 示例,为 MNIST 示例数据集定义了一个简单的网络。请注意,这些层仅在初始化程序中创建和配置。它们之间的连接留给前向方法。此方法获取输入(图像数据),将其通过网络向前推进,并返回预测。

      def forward(self, x):
    x = self.conv1(x)
    x = F.relu(x)
    # ...
    x = F.max_pool2d(x, 2)
    x = self.dropout1(x)
    # ...
    x = self.fc2(x)
    output = F.log_softmax(x, dim=1)
    return output
    

为了简洁起见,省略了多余的行。但你可以看到变量x在通过网络时始终保持预测的当前状态。这也是激活函数的引入方式。

熟悉 Keras 的人可能会对完成此任务所需的代码量感到震惊。Keras 中的许多单行调用在 PyTorch 中需要多行代码。但同样,PyTorch 为您提供了 Keras 所不具备的控制级别。另一方面,如果您使用较低级别的 TensorFlow API,PyTorch 所需的代码比完成相同任务所需的代码要少。

在 PyTorch 中训练模型

在训练 PyTorch 模型之前,必须从torch.utils.data模块中的DataLoader加载数据集。

      train_loader = torch.utils.data.DataLoader(torchvision.datasets.MNIST(...))
    

在使用神经网络训练模型时,利用 GPU 通常会有所帮助。必须在 PyTorch 中明确启用 GPU。

      device = torch.device("cuda" if use_cuda else "cpu")
    

然后在创建新网络时使用该设备。

      model = Net().to(device)
    

实际训练需要优化器。

      optimizer = torch.optim.Adadelta(...)
    

然后迭代DataLoader并训练模型。

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

必须将数据目标传输至 GPU设备

      data, target = data.to(device), target.to(device)
    

对于每次通过,优化器梯度都会被清零。

      optimizer.zero_grad()
    

从模型接收到数据预测。这是调用前向方法的地方。

      output = model(data)
    

功能模块提供了损失函数的实现。损失函数将预测输出与预期目标值进行比较。

      loss = F.nll_loss(output, target)
    

接下来是反向传播步骤。

      loss.backward()
    

最后,优化器更新模型。

      optimizer.step()
    

在多次遍历训练数据后,可以使用类似的方法测试模型,但无需计算梯度。一旦模型足够准确,保存它就很简单了。

      torch.save(model.state_dict(), 'mnist.pt')
    

显然,这比 Keras 所需的代码要多得多。Keras 中的等效代码可能只有一行。但使用 PyTorch 还有其他优势。

PyTorch 张量

PyTorch 中的数据存储在Tensor中。

      x = torch.tensor([[2, 3], [5, 7]])
    

从概念上讲,张量是一个具有一些新技巧的多维列表。在数据科学界,这些通常是用numpy创建的。PyTorch 相对于 TensorFlow 的一个优势是能够在tensornumpy.array之间无缝移动。

      np_array_x = x.numpy()
    

您还可以轻松地numpy.array创建张量

      import numpy as np
y = np.random.randint(0, 10, size=(2, 3))
tensor_y = torch.from_numpy(y)
    

动态计算图

在深度学习中,计算图类似于流程图。图表的节点可以表示操作,例如数学函数或变量。

这里的计算图与函数(a + b) / x相同。在 PyTorch 中,计算图是在训练期间创建的。这样,图可以根据训练数据进行调整。静态计算图假设所有数据具有相同的大小和结构。传统上,TensorFlow 使用静态计算图。TensorFlow 2.0 添加了一些动态功能,但旧代码仍将使用静态图。

计算图由 PyTorch 中的autograd模块实现的自动微分技术创建。在网络的前向传播过程中,将创建计算图。这使得反向传播步骤成为一个简单的方法调用。可以通过在Tensor上调用方法require_grad_并传递True来开始跟踪,从而跟踪图中的操作。在训练期间调用后向方法时,将计算每个正在跟踪的操作的梯度。可以使用no_grad方法关闭整个图的跟踪以加快执行速度,例如在模型测试期间。

光网络

ONNX 是持久化机器学习模型的标准。PyTorch 支持将模型导出为 ONNX 格式。许多其他深度学习库(包括 TensorFlow)都可以导入 ONNX 模型。这样,您可以利用 PyTorch 中的训练模型功能,但在利用其他库的项目中使用这些模型。这对于迁移学习尤其重要。

TensorBoard

结论

PyTorch 非常适合那些不需要 TensorFlow 的复杂性,但需要比 Keras 更多的控制的项目。这并不意味着应该一直避免使用 Keras。研究和工业领域的专业人士都在使用 Keras。但 Keras 的假设并不适用于所有情况。PyTorch 允许您自定义神经网络以满足项目要求,同时仍可利用 Python 语言功能。谢谢阅读!

以上内容来自杭州电子商务研究院推送
关注
关于我们
热门推荐
合作伙伴
免责声明:本站部分资讯来源于网络,如有侵权请及时联系客服,我们将尽快处理
Copyright © 2025-2027 ToB产业网址导航 公安备案 浙公网安备33010602013138号 浙ICP备16025413号-9
支持 反馈 关注 数据