探索 Python 库:PyTorch

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

介绍

深度学习是机器学习和人工智能领域最热门的话题之一。本指南将向您介绍 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
支持 反馈 关注 数据