Press "Enter" to skip to content

“五步学习PyTorch入门指南”

“五步学习PyTorch入门指南” 四海 第1张

 

PyTorch和PyTorch Lightning简介

 

PyTorch是一种基于Python的流行开源机器学习框架,专为GPU加速计算进行了优化。最初由Meta AI于2016年开发,并现在是Linux Foundation的一部分,PyTorch已经迅速成为深度学习研究和应用中最广泛使用的框架之一。

与TensorFlow等其他框架不同,PyTorch使用动态计算图,可以提供更大的灵活性和调试能力。PyTorch的关键优点包括:

  • 简洁直观的Python API用于构建神经网络
  • 广泛支持GPU/TPU加速
  • 内置的自动微分支持
  • 分布式训练功能
  • 与NumPy等其他Python库的互操作性

PyTorch Lightning是在PyTorch基础上构建的一个轻量级封装,进一步简化了研究员工作流程和模型开发的过程。使用Lightning,数据科学家可以更专注于设计模型,而不是繁琐的代码编写。Lightning的关键优势包括:

  • 提供组织PyTorch代码的结构
  • 处理训练循环的样板代码
  • 通过超参数调整加速研究实验
  • 简化模型扩展和部署

通过将PyTorch的强大灵活性与Lightning的高级API结合起来,开发人员可以快速构建可扩展的深度学习系统并迭代更快。

 

步骤1:安装和设置

 

要开始使用PyTorch和Lightning,首先需要安装一些先决条件:

  • Python 3.6或更高版本
  • Pip软件包安装程序
  • 推荐使用NVidia GPU进行加速操作(也可以使用仅CPU设置,但速度较慢)

 

安装Python和PyTorch

 

建议使用Anaconda设置用于数据科学和深度学习工作负载的Python环境。按照以下步骤进行操作:

  • 这里下载并安装适用于您的操作系统的Anaconda
  • 创建一个Conda环境(或使用其他Python环境管理器):conda create -n pytorch python=3.8
  • 激活环境:conda activate pytorch
  • 安装PyTorch:conda install pytorch torchvision torchaudio -c pytorch

通过在Python中运行快速测试来验证PyTorch是否正常安装:

import torchx = torch.rand(3, 3)print(x)

 

这将打印出一个随机的3×3张量,确认PyTorch正常工作。

 

安装PyTorch Lightning

 

使用pip安装PyTorch Lightning:

pip install lightning

确认Lightning是否正确设置:

import lightningprint(lightning.__version__)

 

这应该打印出版本号,例如0.6.0

现在我们已经准备好开始构建深度学习模型了。

 

步骤2:使用PyTorch构建模型

 

PyTorch使用张量作为其核心数据结构,类似于NumPy数组。张量可以由GPU进行操作,并支持用于构建神经网络的自动微分。

让我们定义一个简单的用于图像分类的神经网络:

import torchimport torch.nn as nnimport torch.nn.functional as Fclass 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 = torch.flatten(x, 1)        x = F.relu(self.fc1(x))        x = F.relu(self.fc2(x))        x = self.fc3(x)        return xnet = Net()

这定义了一个有两个卷积层和三个全连接层的卷积神经网络,用于对10个类进行分类。 forward() 方法定义了数据如何通过网络传递。

现在我们可以使用Lightning在样本数据上训练这个模型。

步骤3:使用Lightning训练模型

Lightning提供了一个LightningModule类来封装PyTorch模型代码和训练循环的样板代码。让我们转换我们的模型:

import lightning as plclass LitModel(pl.LightningModule):    def __init__(self):        super().__init__()        self.model = Net()        def forward(self, x):        return self.model(x)    def training_step(self, batch, batch_idx):        x, y = batch        y_hat = self.forward(x)        loss = F.cross_entropy(y_hat, y)        return loss    def configure_optimizers(self):        return torch.optim.Adam(self.parameters(), lr=0.02)        model = LitModel()

training_step()定义了前向传递和损失计算。我们使用学习率0.02配置了一个Adam优化器。

现在我们可以轻松地训练这个模型:

trainer = pl.Trainer()trainer.fit(model, train_dataloader, val_dataloader)

Trainer自动处理了周期循环、验证和日志记录。我们可以在测试数据上评估模型(有关数据模块的更多信息请参见 这里的数据模块):

result = trainer.test(model, test_dataloader)print(result)

为了对比,这里是纯PyTorch中网络和训练循环的代码:

import torchimport torch.nn.functional as Ffrom torch.utils.data import DataLoader# 假设Net类、train_dataloader、val_dataloader、test_dataloader已经定义class Net(torch.nn.Module):    # 在这里定义你的网络架构    pass# 初始化模型和优化器model = Net()optimizer = torch.optim.Adam(model.parameters(), lr=0.02)# 训练循环for epoch in range(10):  # 训练轮数    for batch_idx, (x, y) in enumerate(train_dataloader):        optimizer.zero_grad()        y_hat = model(x)        loss = F.cross_entropy(y_hat, y)        loss.backward()        optimizer.step()# 验证循环model.eval()with torch.no_grad():    for x, y in val_dataloader:        y_hat = model(x)# 测试循环和评估model.eval()test_loss = 0with torch.no_grad():    for x, y in test_dataloader:        y_hat = model(x)        test_loss += F.cross_entropy(y_hat, y, reduction='sum').item()test_loss /= len(test_dataloader.dataset)print(f"Test loss: {test_loss}")

Lightning使得PyTorch模型开发变得极其快速和直观。

步骤4:高级主题

Lightning提供了许多内置功能,用于超参数调整、防止过拟合和模型管理。

超参数调整

我们可以使用Lightning的模块来优化学习率等超参数:

tuner = pl.Tuner(trainer)tuner.fit(model, train_dataloader)print(tuner.results)

这将在超参数空间上执行贝叶斯搜索。

处理过拟合

像dropout层和提前停止这样的策略可以减少过拟合:

model = LitModel()model.add_module('dropout', nn.Dropout(0.2)) # 正则化trainer = pl.Trainer(early_stop_callback=True) # 提前停止

模型保存和加载

Lightning使得保存和重新加载模型变得简单:

# 保存trainer.save_checkpoint("model.ckpt") # 加载model = LitModel.load_from_checkpoint(checkpoint_path="model.ckpt")

这保留了完整的模型状态和超参数。

步骤5:比较PyTorch和PyTorch Lightning

PyTorch和PyTorch Lightning都是强大的深度学习库,但它们有不同的用途和独特的功能。PyTorch提供了设计和实现深度学习模型的基础块,而PyTorch Lightning旨在简化模型训练中的重复部分,从而加快开发过程。

关键差异

下面是PyTorch和PyTorch Lightning之间的关键差异摘要:

功能 PyTorch PyTorch Lightning
训练循环 手动编写 自动化
样板代码 必需的 最小
超参数调优 手动设置 内置支持
分布式训练 可用但手动设置 自动化
代码组织 无特定结构 鼓励模块化设计
模型保存和加载 需要自定义实现 使用检查点简化
调试 高级但手动 内置日志更易于
GPU/TPU支持 可用 更容易设置

灵活性与便利性

PyTorch以其灵活性而闻名,尤其是采用动态计算图,在研究和实验方面非常出色。然而,这种灵活性往往以编写更多的样板代码为代价,特别是对于训练循环、分布式训练和超参数调优。另一方面,PyTorch Lightning在保留完全自定义和访问较低级别PyTorch API的同时,抽象了大部分的样板代码。

开发速度

如果您从头开始一个项目,或者进行复杂的实验,PyTorch Lightning可以节省大量时间。LightningModule类简化了训练过程,自动记录日志,甚至简化了分布式训练。这使您可以更多地关注模型架构,而不是模型训练和验证中的重复部分。

结论

总之,PyTorch提供了更精细的控制,非常适合需要详细控制的研究人员。然而,PyTorch Lightning旨在使研究到生产的周期更加平滑和快速,同时保留了PyTorch提供的强大和灵活性。您选择使用PyTorch还是PyTorch Lightning将取决于您的具体需求,但好消息是您可以很容易地在两者之间进行切换,甚至在项目的不同部分同时使用它们。

展望未来

 

在本文中,我们介绍了使用PyTorch和PyTorch Lightning进行深度学习的基础知识:

  • PyTorch为构建神经网络提供了强大而灵活的框架
  • PyTorch Lightning简化了训练和模型开发工作流程
  • 关键功能如超参数优化和模型管理加速了深度学习研究

有了这些基础,您可以开始构建和训练像CNNs,RNNs,GANs等高级模型。活跃的开源社区也提供了Lightning支持和增强功能,如Bolt,一个组件和优化库。

祝愉快的深度学习!

  Matthew Mayo (@mattmayo13) 拥有计算机科学硕士学位和数据挖掘研究生文凭。作为VoAGI的主编,Matthew的目标是使复杂的数据科学概念易于理解。他的职业兴趣包括自然语言处理,机器学习算法以及探索新兴的人工智能。他致力于在数据科学社区推广知识的民主化。Matthew自6岁起就开始编程。

Leave a Reply

Your email address will not be published. Required fields are marked *