PyTorch 提高生产力的技巧

本文涉及的产品
实时计算 Flink 版,5000CU*H 3个月
实时数仓Hologres,5000CU*H 100GB 3个月
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
简介: PyTorch 提高生产力的技巧
推荐:使用 NSDT场景编辑器 助你快速搭建3D应用场景

介绍

您是否曾经花费数小时调试机器学习模型,但似乎找不到准确性没有提高的原因?你有没有觉得一切都应该完美地工作,但由于某种神秘的原因,你没有得到模范的结果?

好吧,没有了。作为初学者探索 PyTorch 可能会令人生畏。在本文中,您将探索久经考验的工作流程,这些工作流程肯定会改善您的结果并提高模型的性能。

1. 过拟合单个批次

曾经在大型数据集上训练模型数小时只是为了发现损失没有减少,准确性只是扁平化?好吧,先做一个健全性检查。

在大型数据集上训练和评估可能非常耗时,并且首先在一小部分数据上调试模型更容易。一旦我们确定模型正常工作,我们就可以轻松地将训练扩展到完整的数据集。

与其在整个数据集上进行训练,不如始终在单个批次上进行训练以进行健全性检查

batch = next(iter(train_dataloader)) # Get a single batch
# For all epochs, keep training on the single batch.
for epoch in range(num_epochs):
    inputs, targets = batch    
    predictions = model.train(inputs)

考虑上面的代码片段。假设我们已经有一个训练数据加载器和一个模型。我们无需迭代完整的数据集,而是可以轻松获取第一批数据集。然后,我们可以对单个批次进行训练,以检查模型是否可以学习这一小部分数据中的模式和方差。

如果损失减少到一个非常小的值,我们知道模型可以过度拟合这些数据,并且可以确保它在短时间内学习。然后,我们可以通过简单地更改一行来在整个数据集上对其进行训练,如下所示:

# For all epochs, iterate over all batches of data.
for epoch in range(num_epochs):
    for batch in iter(dataloader):
        inputs, targets = batch    
        predictions = model.train(inputs)

如果模型可以过度拟合单个批次,它应该能够学习完整数据集中的模式。这种过拟合批处理方法使调试更容易。如果模型甚至不能过度拟合单个批次,我们可以确定模型实现而不是数据集存在问题。

2. 规范化和随机播放数据

对于数据序列不重要的数据集,对数据进行随机排序会很有帮助。例如,对于图像分类任务,如果在单个批次中馈送不同类的图像,则模型将更好地拟合数据。以相同的顺序传递数据,我们冒着模型根据传递的数据序列学习模式的风险,而不是学习数据中的内在方差。因此,最好传递随机数据。为此,我们可以简单地使用 PyTorch 提供的 DataLoader 对象并将 shuffle 设置为 True。

from torch.utils.data import DataLoader
dataset = # Loading Data
dataloder = DataLoader(dataset, shuffle=True)

此外,在使用机器学习模型时规范化数据非常重要。当我们的数据存在较大方差并且特定参数的值高于数据集中的所有其他属性时,这一点至关重要。这可能会导致其中一个参数主导所有其他参数,从而导致精度降低。我们希望所有输入参数都在同一范围内,最好有 0 均值和 1.0 方差。 为此,我们必须转换我们的数据集。知道数据集的均值和方差后,我们可以简单地使用torchvision.transforms.Normalize函数。

import torchvision.transforms as transforms
image_transforms = transforms.Compose([
  transforms.ToTensor(),
  # Normalize the values in our data
  transforms.Normalize(mean=(0.5,), std=(0.5))
])

我们可以在变换中传递每个通道的平均值和标准差。归一化函数,它将自动转换平均值为 0 且标准差为 1 的数据。

3. 渐变剪切

梯度爆炸是RNN和LSTM中的一个已知问题。但是,它不仅限于这些体系结构。任何具有深层的模型都可能遭受梯度爆炸的影响。高梯度上的反向传播会导致发散,而不是损耗逐渐减少。

请考虑以下代码片段。

for epoch in range(num_epochs):
  for batch in iter(train_dataloader):
      inputs, targets = batch
      predictions = model(inputs)
      optimizer.zero_grad() # Remove all previous gradients
      loss = criterion(targets, predictions)
      loss.backward() # Computes Gradients for model weights
      # Clip the gradients of model weights to a specified max_norm value.
      torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1)
      # Optimize the model weights AFTER CLIPPING
      optimizer.step()

为了解决梯度爆炸问题,我们使用渐变裁剪技术,将梯度值裁剪在指定范围内。例如,如果我们使用 1 作为上面的裁剪或范数值,则所有渐变都将在 [-1, 1] 范围内裁剪。如果我们的爆炸梯度值为 50,它将被裁剪为 1。因此,梯度裁剪解决了梯度爆炸问题,允许对模型进行缓慢的优化,使其趋同。

4.切换列车/评估模式

这一行代码肯定会提高模型的测试准确性。深度学习模型几乎总是使用辍学层和规范化层。这些只是稳定训练和确保模型不会因数据差异而过度拟合或发散时才需要的。BatchNorm 和 Dropout 等层在训练期间为模型参数提供正则化。但是,一旦经过培训,就不需要它们。将模型更改为评估模式将禁用仅训练所需的层,并且完整的模型参数用于预测。

For a better understanding, consider this code snippet.

for epoch in range(num_epochs):
  # Using training Mode when iterating over training dataset
  model.train()
  for batch in iter(train_dataloader):
          # Training Code and Loss Optimization
  # Using Evaluation Mode when checking accuarcy on validation dataset
  model.eval()
  for batch in iter(val_dataloader):
          # Only predictions and Loss Calculations. No backpropogation
          # No Optimzer Step so we do can omit unrequired layers.

评估时,我们不需要对模型参数进行任何优化。在验证步骤中,我们不计算任何梯度。为了更好地评估,我们可以省略 Dropout 和其他规范化层。例如,它将启用所有模型参数,而不是像 Dropout 图层中那样仅启用权重子集。这将大大提高模型的准确性,因为您将能够使用完整的模型。

5. 使用模块和模块列表

PyTorch 模型通常继承自 torch.nn.Module 基类。根据文档:

以这种方式分配的子模块将被注册,并在调用 to()时转换其参数。

模块基类允许的是注册模型中的每个层。然后,我们可以使用 model.to() 和类似的函数,例如 model.train() 和 model.eval(),它们将应用于模型内的每一层。如果不这样做,将不会更改模型中包含的每个层的设备或训练模式。您必须手动执行此操作。一旦您仅在模型对象上使用函数,Module 基类将自动为您进行转换。

此外,一些模型包含类似的顺序层,可以使用 for 循环轻松初始化并包含在列表中。这简化了代码。但是,它会导致与上述相同的问题,因为简单 Python 列表中的模块不会在模型中自动注册。我们应该使用 ModuleList 来包含模型中类似的顺序层。

import torch
import torch.nn as nn
# Inherit from the Module Base Class
class Model(nn.Module):
      def __init__(self, input_size, output_size):
          # Initialize the Module Parent Class
          super().__init__()
           self.dense_layers = nn.ModuleList()
          # Add 5 Linear Layers and contain them within a Modulelist
          for i in range(5):
              self.dense_layers.append(
                  nn.Linear(input_size, 512)
              )
          self.output_layer = nn.Linear(512, output_size)
  def forward(self, x):
          # Simplifies Foward Propogation.
          # Instead of repeating a single line for each layer, use a loop
          for layer in range(len(self.dense_layers)):
          x = layer(x)
          return self.output_layer(x)

上面的代码片段显示了使用模型创建模型和子层的正确方法。使用模块和模块列表有助于避免在训练和评估模型时出现意外错误。

结论

上述方法是 PyTorch 机器学习框架的最佳实践。它们被广泛使用,并被 PyTorch 文档推荐。使用这样的方法应该是机器学习代码流的主要方式,并且肯定会改善你的结果。

3D建模学习工作室 整理翻译,转载请注明出处!

目录
相关文章
|
3天前
|
人工智能 自然语言处理 Shell
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
仅用3分钟,百炼调用满血版Deepseek-r1 API,享受百万免费Token。阿里云提供零门槛、快速部署的解决方案,支持云控制台和Cloud Shell两种方式,操作简便。Deepseek-r1满血版在推理能力上表现出色,尤其擅长数学、代码和自然语言处理任务,使用过程中无卡顿,体验丝滑。结合Chatbox工具,用户可轻松掌控模型,提升工作效率。阿里云大模型服务平台百炼不仅速度快,还确保数据安全,值得信赖。
157353 24
深度评测 | 仅用3分钟,百炼调用满血版 Deepseek-r1 API,百万Token免费用,简直不要太爽。
|
5天前
|
人工智能 API 网络安全
用DeepSeek,就在阿里云!四种方式助您快速使用 DeepSeek-R1 满血版!更有内部实战指导!
DeepSeek自发布以来,凭借卓越的技术性能和开源策略迅速吸引了全球关注。DeepSeek-R1作为系列中的佼佼者,在多个基准测试中超越现有顶尖模型,展现了强大的推理能力。然而,由于其爆火及受到黑客攻击,官网使用受限,影响用户体验。为解决这一问题,阿里云提供了多种解决方案。
17010 37
|
13天前
|
机器学习/深度学习 人工智能 自然语言处理
PAI Model Gallery 支持云上一键部署 DeepSeek-V3、DeepSeek-R1 系列模型
DeepSeek 系列模型以其卓越性能在全球范围内备受瞩目,多次评测中表现优异,性能接近甚至超越国际顶尖闭源模型(如OpenAI的GPT-4、Claude-3.5-Sonnet等)。企业用户和开发者可使用 PAI 平台一键部署 DeepSeek 系列模型,实现 DeepSeek 系列模型与现有业务的高效融合。
|
5天前
|
并行计算 PyTorch 算法框架/工具
本地部署DeepSeek模型
要在本地部署DeepSeek模型,需准备Linux(推荐Ubuntu 20.04+)或兼容的Windows/macOS环境,配备NVIDIA GPU(建议RTX 3060+)。安装Python 3.8+、PyTorch/TensorFlow等依赖,并通过官方渠道下载模型文件。配置模型后,编写推理脚本进行测试,可选使用FastAPI服务化部署或Docker容器化。注意资源监控和许可协议。
1311 8
|
13天前
|
人工智能 搜索推荐 Docker
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
DeepSeek R1 + LobeChat + Ollama:快速本地部署模型,创建个性化 AI 助手
3416 117
手把手教你使用 Ollama 和 LobeChat 快速本地部署 DeepSeek R1 模型,创建个性化 AI 助手
|
8天前
|
人工智能 自然语言处理 API
DeepSeek全尺寸模型上线阿里云百炼!
阿里云百炼平台近日上线了DeepSeek-V3、DeepSeek-R1及其蒸馏版本等六款全尺寸AI模型,参数量达671B,提供高达100万免费tokens。这些模型在数学、代码、自然语言推理等任务上表现出色,支持灵活调用和经济高效的解决方案,助力开发者和企业加速创新与数字化转型。示例代码展示了如何通过API使用DeepSeek-R1模型进行推理,用户可轻松获取思考过程和最终答案。
|
5天前
|
人工智能 自然语言处理 程序员
如何在通义灵码里用上DeepSeek-V3 和 DeepSeek-R1 满血版671B模型?
除了 AI 程序员的重磅上线外,近期通义灵码能力再升级全新上线模型选择功能,目前已经支持 Qwen2.5、DeepSeek-V3 和 R1系列模型,用户可以在 VSCode 和 JetBrains 里搜索并下载最新通义灵码插件,在输入框里选择模型,即可轻松切换模型。
934 14
|
12天前
|
API 开发工具 Python
阿里云PAI部署DeepSeek及调用
本文介绍如何在阿里云PAI EAS上部署DeepSeek模型,涵盖7B模型的部署、SDK和API调用。7B模型只需一张A10显卡,部署时间约10分钟。文章详细展示了模型信息查看、在线调试及通过OpenAI SDK和Python Requests进行调用的步骤,并附有测试结果和参考文档链接。
1938 9
阿里云PAI部署DeepSeek及调用
|
9天前
|
人工智能 数据可视化 Linux
【保姆级教程】3步搞定DeepSeek本地部署
DeepSeek在2025年春节期间突然爆火出圈。在目前DeepSeek的网站中,极不稳定,总是服务器繁忙,这时候本地部署就可以有效规避问题。本文以最浅显易懂的方式带读者一起完成DeepSeek-r1大模型的本地部署。
|
12天前
|
缓存 自然语言处理 安全
快速调用 Deepseek API!【超详细教程】
Deepseek 强大的功能,在本教程中,将指导您如何获取 DeepSeek API 密钥,并演示如何使用该密钥调用 DeepSeek API 以进行调试。