快速开始 PyTorch|使用 Python 建立深度学习模型
🎯 本教程旨在快速掌握使用 PyTorch 建立深度学习模型的范式周期。
一键运行,你可以快速在实践中检验你的想法。
丰富完善的注释,对于入门者友好。
在 Bohrium Notebook 界面,你可以点击界面上方蓝色按钮 开始连接
,选择 bohrium-notebook
镜像及任何一款节点配置,稍等片刻即可运行。
目标
掌握使用 PyTorch 建立深度学习模型的范式周期,并跟随完整案例学习如何应用于预测任务。
在学习本教程后,你将能够:
- 初识 PyTorch,安装 PyTorch 并验证其运行。
- 通过五个步骤了解建立、拟合和验证 PyTorch 模型的范式周期。
- 掌握如何为回归、分类预测任务建立 PyTorch 深度学习模型。
阅读该教程【最多】约需 60 分钟,让我们开始吧!
背景
你不需要理解所有的事(至少目前是)。 你的目标是从头到尾完成本教程并获得结果。你不需要在第一次尝试时就了解所有内容。边学习边写下你的问题。使用丰富的 API 文档来了解你正在使用的所有功能。
你不需要精通数学原理。 数学是描述算法如何工作的基本方式,特别是线性代数、概率和微积分的工具。这些并不是你可以用来了解算法如何工作的唯一工具。你还可以通过使用代码并探索具有不同输入和输出的算法行为来增进了解。了解数学不会告诉你选择哪种算法或如何最好地配置它。你只能通过精心控制的实验来发现这一点。
你不需要知道算法是如何工作的。 了解限制以及如何配置深度学习算法非常重要。但是学习算法可以稍后进行。你需要在很长一段时间内慢慢建立这种算法知识。今天,首先要熟悉这个平台。
你不需要精通 Python。 如果你不熟悉 Python 语言,不要担心,Python 的语法是直观的。就像其他语言一样,你只需要专注于函数调用(例如 function())和赋值(例如 a = “b”)(这已包括了大部分使用场景)。只需开始,稍后再深入了解详细信息。
你不需要成为深度学习专家。 你可以稍后了解各种算法的优点和局限性,并且你可以阅读大量教程来复习深度学习项目的步骤。
你需要提前了解以下基础知识:
- Python 基础,例如 class 和 function 的知识。如果你不了解,推荐阅读:
- 深度学习的基本概念,例如关于什么是特征和标签、训练集和测试集,什么是神经网络。如果你不了解,推荐阅读:
1.1 什么是 PyTorch [1]
PyTorch 是由 Facebook 开发和维护的用于深度学习的开源 Python 库。
该项目于 2016 年启动,并迅速成为开发人员和研究人员中流行的框架。
Torch (Torch7) 是一个用 C 编写的用于深度学习的开源项目,通常通过 Lua 接口使用。它是 PyTorch 的前身项目,不再积极开发。 PyTorch 在名称中包含 “Torch” 以感谢先前的 torch 库,使用 "Py" 作为前缀以表明聚焦于 Python。
PyTorch API 简单灵活,使其成为学术界和研究人员开发新的深度学习模型和应用程序的最爱之一。同时,广泛的应用衍生了许多针对特定应用(例如文本、计算机视觉和音频数据)的扩展,并且可作为预训练模型直接使用。因此,它可能是学术界使用最多的库。
与 Keras 等更简单的界面相比,PyTorch 的灵活性是以易用性为代价的,尤其是对于初学者而言。选择 PyTorch 而不是 Keras 的意味着放弃了一些易用性、需要面对更陡峭的学习曲线、以及使用更多的代码以获得更大的灵活性,也许还有一个更有活力的学术社区。
1.2 安装 Pytorch
本教程是一个 Bohrium Notebook。Python 程序可直接在浏览器中运行,Bohrium 已安装 PyTorch。这是学习和使用 PyTorch 的好方法。
要按照本教程进行操作,请点击本页顶部的按钮,在 Bohrium Notebook 中运行本笔记本。
你可以点击界面上方蓝色按钮
开始连接
,选择bohrium-notebook
镜像及任何一款计算机型,稍等片刻即可运行。若要运行笔记本中的所有代码,请点击左上角“ 运行全部单元格 ”。若要一次运行一个代码单元,请选择需要运行的单元格,然后点击左上角 “运行选中的单元格” 图标。
如果你的 Bohrium 镜像尚未安装 PyTorch, 也可快速通过 pip 安装 torch:
Requirement already satisfied: torch in /opt/anaconda3/envs/ML_env/lib/python3.9/site-packages (1.13.1) Requirement already satisfied: typing-extensions in /opt/anaconda3/envs/ML_env/lib/python3.9/site-packages (from torch) (4.4.0)
如果你需要使用更特定于你的平台或包管理器的安装方法,你可以在这里查看更完整的安装说明。
1.13.1
2 PyTorch 深度学习模型的建立范式
在本节中,你将了解深度学习模型的建立范式以及可用于定义模型的 PyTorch API。
建立模型有一个范式,这个非常简单的知识为数据建模和理解 PyTorch API 提供了支撑。
模型建立范式中的五个步骤如下:
- 准备数据。
- 定义模型。
- 训练模型。
- 评估模型。
- 做出预测。
注意:使用 PyTorch API 有很多方法可以实现这些步骤,我们的目标是向你展示最简单、最常见或最惯用的方法。
如果你发现更好的方法,请通过邮箱告诉我。
接下来让我们依次仔细看看每个步骤。
在本节中,我们将以 基于鸢尾花数据集的多分类感知机 为例进行介绍。
这个问题涉及在给定花的测量值的情况下预测鸢尾花的种类。
数据集将使用 Pandas 自动下载,但您可以在此处了解更多信息:
2.1 准备数据
第一步是加载和准备数据。
神经网络模型需要输入数据和输出数据。
你可以使用标准 Python 库来加载和准备多维数据,例如 CSV 文件。
Pandas 可用于加载你的 CSV 文件,Scikit-Learn 中的工具可用于编码分类数据,例如对标签分类。
PyTorch 提供了 Dataset 类,你可以扩展和自定义该类以加载你的数据集。
例如,数据集对象的构造函数可以加载你的数据文件(例如 CSV 文件)。然后,你可以覆盖可用于获取数据集长度(行数或样本数)的 __len__()
函数,以及用于按索引获取特定样本的 __getitem__()
函数。
加载数据集时,你还可以执行任何所需的转换,例如缩放或编码。
下面提供了自定义数据集类的框架。
让我们运行一下定义的 CSVDataset() 类中的各方法以加深理解
输入矩阵的形状是:(150, 4)
输出矩阵的形状是:(150,)
150 150
[array([5.9, 3. , 5.1, 1.8], dtype=float32), 2] [array([5.9, 3. , 5.1, 1.8], dtype=float32), 2]
加载后,PyTorch 提供 DataLoader 类,用于在模型训练和评估期间导航数据集实例。
可以为训练数据集、测试数据集甚至验证数据集创建 DataLoader 实例。
random_split()
函数可用于将数据集拆分为训练集和测试集。
拆分后,将数据集中 batch 及其 size 提供给 DataLoader,并可选择是否应在每个 epoch 对数据进行随机排序。
了解什么是 epoch 和 batch,推荐阅读:训练神经网络中最基本的三个概念:Epoch, Batch, Iteration
划分的训练集的数据类型是:<class 'torch.utils.data.dataset.Subset'> 划分的训练集长度是:100
例如,我们可以通过传入数据集中的选定行来定义 DataLoader。
100 50
定义后,可以循环 DataLoader,每次迭代生成一批样本。
第 0 个 batch 有 32 个数据,其中输入矩阵的形状是 torch.Size([32, 4]),输出矩阵的形状是 torch.Size([32]) 第 1 个 batch 有 32 个数据,其中输入矩阵的形状是 torch.Size([32, 4]),输出矩阵的形状是 torch.Size([32]) 第 2 个 batch 有 32 个数据,其中输入矩阵的形状是 torch.Size([32, 4]),输出矩阵的形状是 torch.Size([32]) 第 3 个 batch 有 4 个数据,其中输入矩阵的形状是 torch.Size([4, 4]),输出矩阵的形状是 torch.Size([4]) 共有 4 个 batches
enumerate() 函数是 Python 内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个有索引的序列,同时列出数据和数据下标。多用在 for 循环中。
尝试在本 Notebook 中运行以下示例并理解 enumerate() 函数。
[(1, ('Spring', 'Green')), (2, ('Summer', 'Red')), (3, ('Fall', 'Yellow')), (4, ('Winter', 'White'))] -------- My impression 1 about Spring is Green. My impression 2 about Summer is Red. My impression 3 about Fall is Yellow. My impression 4 about Winter is White.
2.2 定义模型
下一步是定义模型。
在 PyTorch 中定义模型的习惯用法是定义一个继承 Module 类的 Python class 。
你构造的类定义了模型的层,forward()
函数需要覆写以定义在模型层中的输入参数的前向传播。
了解什么是前向传播,推荐阅读:笔记 | 什么是Forward Propagation
许多层都可用,例如用于全连接层的 Linear,用于卷积层的 Conv2d,用于池化层的 MaxPool2d。
激活函数也可以定义为层,例如 ReLU, Softmax, 和 Sigmoid.
在构造函数中定义给定层后,也可以初始化给定层的权重。
常见的例子包括 Xavier 和 He weight 权重初始化方案。例如:xavier_uniform_(self.layer.weight)
下面是一个简单的单层 MLP 模型的示例。
2.3 训练模型
训练过程要求你定义 损失函数 和 优化算法 。
常见的损失函数包括:
- BCELoss: 用于二元分类的 二元交叉熵损失 (Binary Cross-Entropy Loss)
- CrossEntropyLoss: 用于多元分类的 多元交叉熵损失 (Categorical Cross-Entropy Loss)
- MSELoss: 用于回归的 均方损失 (Mean squared loss)
有关损失函数的更多信息,请参阅教程:
使用 随机梯度下降 进行优化,标准算法由 SGD class 提供,该算法的其他版本也可用,例如 Adam。
了解随机梯度下降,请参阅:如何理解随机梯度下降(stochastic gradient descent,SGD)?
训练模型涉及枚举训练数据集的 DataLoader。
首先,需要为大量的 training epochs 建立一个循环。然后,需要为每个 mini-batch 建立一个内部循环,用于随机梯度下降。
模型的每次更新都涉及相同的常规模式,包括:
- 清除最后一个误差梯度。
- 前向传播并计算模型输出。
- 计算模型输出的损失。
- 通过模型反向传播误差。
- 更新模型以减少损失。
例如:
...
# 梯度清除
optimizer.zero_grad()
# 计算模型输出
yhat = model(inputs)
# 计算损失
loss = criterion(yhat, targets)
# 贡献度分配
loss.backward()
# 升级模型权重
optimizer.step()
0.58
2.5 做出预测
拟合模型可用于对新数据进行预测。
例如,您可能有单个图像或一行数据,并且想要进行预测。
这需要您将数据包装在 PyTorch Tensor 数据结构中。
Tensor 只是用于保存 NumPy 数组类型的数据的 PyTorch 版本。它还允许您在模型图中执行自动微分任务,例如在训练模型时调用 backward()
。
预测也将是一个 Tensor,尽管您可以通过在自动微分图中分离张量并调用 NumPy 函数来检索 NumPy 数组。
各标签可能的概率: [[9.9997008e-01 2.9798704e-05 1.6202495e-07]] (最可能的种类:class=0)
现在我们已经充分熟悉了 PyTorch API 和模型建立范式,让我们看看如何从头开始开发一些标准的深度学习模型。
有关该节示例的连续代码,请见 3.2 建立多分类任务的多层感知机模型
3 为预测任务建立 PyTorch 深度学习模型
在本节中,你将了解如何使用标准深度学习模型(包括多层感知器 (Multi Layer Perceptrons, MLP) 和卷积神经网络 (Convolutional Neural Networks, CNN))进行开发、评估和预测。
多层感知机模型(MLP)是一种标准的全连接神经网络模型。
它由节点层组成,其中每个节点连接到前一层的所有输出,每个节点的输出连接到下一层节点的所有输入。
MLP 是具有一个或多个完全连接层的模型。此模型适用于表格类型的数据。你可能想使用 MLP 探索三个预测建模问题;它们是二元分类、多类分类和回归。让我们在真实数据集上为每种情况拟合一个模型。
注意:本节中的模型有效,但未优化。看看你是否可以提高他们的表现。不要犹豫,试试直接在 Bohrium Notebook 中实现你的想法。
3.1 建立二分类任务的多层感知机模型
我们将使用电离层二分类数据集来演示用于二分类的 MLP。
该数据集涉及预测大气中是否存在给定雷达回波的结构。
数据集将使用 Pandas 自动下载,但你可以在此处了解更多信息:
我们将使用 LabelEncoder 将字符串标签编码为整数值 0 和 1。该模型将适合 67% 的数据,其余 33% 将用于评估,使用 train_test_split() function 函数进行拆分。
使用带有 “He Uniform” 权重初始化的 “relu” 激活函数是一个很好的做法。这种组合对于克服训练深度神经网络模型时梯度消失 的问题大有帮助。有关 ReLU 的更多信息,请参阅教程:
该模型使用随机梯度下降进行优化,并力求最小化二元交叉熵损失。 下面列出了完整的示例。
235 116 Accuracy: 0.931 Predicted: 0.999 (class=1)
运行示例后,首先报告训练数据集和测试数据集的长度,然后拟合模型并在测试数据集上对其进行评估。最后,对单行数据进行预测。
注意:根据算法或评估过程的随机性质或数值精度的差异,你的结果可能会有所不同。请考虑运行几次示例并比较平均结果。
你得到了什么结果?
你能改变模型做得更好吗?
你可以试着修改代码以直接输出平均结果吗?
不要犹豫,试试直接在 Bohrium Notebook 中实现你的想法。
在本例中,我们可以看到该模型实现了大约 94% 的分类准确率,然后预测某行数据属于类 1 的概率为 0.99。
100 50 Accuracy: 0.980 Predicted: [[9.9987459e-01 1.2522198e-04 1.0855692e-07]] (class=0)
运行示例后,首先报告训练数据集和测试数据集的长度,然后拟合模型并在测试数据集上对其进行评估。最后,对单行数据进行预测。
注意:根据算法或评估过程的随机性质或数值精度的差异,你的结果可能会有所不同。请考虑运行几次示例并比较平均结果。
你得到了什么结果?
你能改变模型做得更好吗?
你可以试着修改代码以直接输出平均结果吗?
不要犹豫,试试直接在 Bohrium Notebook 中实现你的想法。
在本例中,我们可以看到该模型实现了大约 98% 的分类准确率,然后预测了其中一行属于某个类的概率,类 0 的概率最高。
339 167 MSE: 84.666, RMSE: 9.201 Predicted: 23.459
运行示例后,首先报告训练数据集和测试数据集的长度,然后拟合模型并在测试数据集上对其进行评估。最后,对单行数据进行预测。
注意:根据算法或评估过程的随机性质或数值精度的差异,你的结果可能会有所不同。请考虑运行几次示例并比较平均结果。
你得到了什么结果?
你能改变模型做得更好吗?
你可以试着修改代码以直接输出平均结果吗?
不要犹豫,试试直接在 Bohrium Notebook 中实现你的想法。
在本例中,我们可以看到该模型实现了大约 103 的 MSE,即大约 10 的 RMSE(单位是千美元)。然后预测单个示例的值为 21(千美元)。
3.4 建立图像分类的卷积神经网络模型
卷积神经网络(简称 CNN)是一种专为图像输入而设计的网络。
它们由具有卷积层的模型组成,这些卷积层可以提取特征(称为特征图),而池化层会将特征提取到最突出的元素。
CNN最适合图像分类任务,尽管它们也可以用于将图像作为输入的各种任务。
一种流行的图像分类任务是 MNIST handwritten digit classification 手写数字分类。它涉及数以万计的手写数字,必须归类为 0 到 9 之间的数字。 torchvision API提供了一个方便的功能,可以直接下载和加载这个数据集。 下面的示例加载数据集并绘制前几个图像。
运行示例加载 MNIST 数据集,然后汇总默认训练和测试数据集。
上述代码创建了一个网格图,显示训练数据集中手写图像的示例。
我们可以训练一个CNN模型来对MNIST数据集中的图像进行分类。
请注意,图像是灰度像素数据的数组,因此,我们必须向数据添加通道维度,然后才能将图像用作模型的输入。
最好将像素值从默认范围 0-255 缩放为零平均值和标准差 1(标准正态分布)。
有关缩放像素值的详细信息,请参阅教程:
下面列出了在MNIST数据集上拟合和评估CNN模型的完整示例。
60000 10000 Accuracy: 0.987
运行示例后,首先报告训练数据集和测试数据集的长度,然后拟合模型并在测试数据集上对其进行评估。最后,对单行数据进行预测。
注意:根据算法或评估过程的随机性质或数值精度的差异,你的结果可能会有所不同。请考虑运行几次示例并比较平均结果。
你得到了什么结果?
你能改变模型做得更好吗?
你可以试着修改代码以直接输出平均结果吗?
不要犹豫,试试直接在 Bohrium Notebook 中实现你的想法。
在本例中,我们可以看到该模型在测试数据集上实现了大约 98% 的分类准确率。
总结
在本教程中,您学习了在 PyTorch 中开发深度学习模型的范式。
具体而言,您了解到:
- Torch 和 PyTorch 之间的区别以及如何安装和确认 PyTorch 是否正常工作。
- PyTorch 模型的建立范式以及如何定义、拟合和评估模型。
- 如何为回归、分类和预测建模任务开发 PyTorch 深度学习模型。
你有什么问题吗? 欢迎与我们联系 bohrium@dp.tech 。
进一步阅读
如果您希望更深入学习 PyTorch,本节提供有关该主题的更多资源。
书籍
- Deep Learning, 2016.
- Programming PyTorch for Deep Learning: Creating and Deploying Deep Learning Applications, 2018.
- Deep Learning with PyTorch, 2020.
- Deep Learning for Coders with fastai and PyTorch: AI Applications Without a PhD, 2020.
PyTorch 项目
参考
- PyTorch Tutorial: How to Develop Deep Learning Models with Python - MachineLearningMastery.com
- Zhang, A.; Lipton, Z. C.; Li, M.; Smola, A. J. Dive into Deep Learning. arXiv preprint arXiv:2106.11342 2021.
©️ Copyright 2024 @ Authors
日期:2023-05-09
共享协议:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
bohrbb3d20
小洲