调试 PyTorch 机器学习模型:分步指南

Debugging PyTorch Machine Learning Models: A Step-by-Step Guide

调试 PyTorch 机器学习模型:分步指南
图片来源:编辑 | Midjourney

引言

调试机器学习模型包括检查、发现和修复这些模型内部机制中可能存在的错误。调试机器学习模型对于确保其正常高效运行至关重要,但调试本身往往具有挑战性。幸运的是,本文将通过分步介绍如何使用 PyTorch 库调试用 Python 编写的机器学习模型来帮助您。

为了说明如何调试 PyTorch 机器学习模型,我们将以一个简单的神经网络模型为例,该模型用于分类,具体来说是使用众所周知的 MNIST 数据集来识别(分类)0 到 9 的手写数字。

准备工作

首先,我们确保 PyTorch 和其他必要的依赖项已安装并导入。

借助 PyTorch 的 nn 包,特别是通过 nn.Module 类,我们将定义一个非常简单的神经网络架构。在 PyTorch 中构建神经网络涉及在构造函数 __init__ 方法中建立其架构,并重写 forward 方法来定义数据通过神经网络层时执行的激活函数和其他计算。

我们刚刚构建的神经网络有两个全连接的线性层,中间有一个 ReLU(修正线性单元)激活函数。第一层将由 28x28 像素手写数字图像组成的原始数据展平成 128 个特征的数组:每个像素一个特征。输出层有 10 个神经元,对应 10 种可能的分类输出:请记住,我们将图像分类为 10 种可能类别中的一种。

接下来,我们加载 MNIST 数据集。这项工作很容易,因为 PyTorch 的 torchvision 包将其作为内置的示例数据集之一提供,因此无需从外部源获取。作为加载数据过程的一部分,我们需要确保它被存储为张量,这是 PyTorch 模型内部管理的数据结构。

接下来,我们初始化模型调用之前定义的函数,建立用于指导数据训练过程的优化标准或损失函数,并选择 Adam 优化器来进一步指导此过程,学习率为适中的 0.001。

分步调试

现在,假设我们怀疑模型有问题(实际上没有,只是假设!),让我们深入调试步骤的核心。第一步很简单,打印模型本身以确保其定义正确。

输出

看起来没问题。接下来,我们使用此指令检查数据(输入图像和输出标签)的形状。

输出

由于我们之前指定了 64 的批量大小,这看起来也说得通。

调试的下一个自然步骤是检查模型产生的输出是否没有错误。这个过程称为前向传播调试,可以通过使用我们之前加载数据集的 train_loader 实例来完成,如下所示。

如果没有引发错误,每个数据批次的输出应如下所示。

机器学习模型出现故障的一个常见原因是训练过程不稳定,在这种情况下,训练损失值通常会变成 NaN(非数字)或无穷大。一种检查此问题的方法是使用以下代码,如果问题不存在,则不会产生任何输出消息。

最后,为了进行更深入的调试,这里提供了一个在训练过程中监控损失和梯度的调试训练循环。

这里涉及的步骤包括:

  1. 清除旧梯度以防止累积
  2. 执行前向传播以获取模型预测
  3. 计算损失,即预测值与实际标签(ground-truth)之间的偏差
  4. 反向传播:计算用于反向传播的梯度,然后调整神经网络权重
  5. 打印每层的梯度范数,以识别爆炸梯度和消失梯度等问题
  6. 通过使用 step() 更新权重或参数
  7. 监控损失:最后一条打印指令有助于跟踪迭代过程中的模型性能

总结

本文通过一个基于神经网络的示例,提供了一系列在 PyTorch 中用于机器学习模型调试的步骤和资源。应用这些调试方法有时可以成为模型的“救命稻草”,帮助识别那些本难以发现的问题。

暂无评论。

发表回复

Machine Learning Mastery 是 Guiding Tech Media 的一部分,Guiding Tech Media 是一家领先的数字媒体出版商,专注于帮助人们了解技术。访问我们的公司网站以了解更多关于我们的使命和团队的信息。