在 PyTorch 中构建多层感知器模型

PyTorch 库用于深度学习。深度学习,实际上,只是大规模神经网络或多层感知机网络的另一个名称。在其最简单的形式中,多层感知机是一系列串联连接的层。在本文中,您将了解可用于在 PyTorch 中创建神经网络和简单深度学习模型的简单组件。

通过我的《用PyTorch进行深度学习》一书来启动你的项目。它提供了包含可用代码自学教程


让我们开始吧。

在 PyTorch 中构建多层感知机模型
照片由 Sharon Cho 拍摄。部分权利保留。

概述

本文分为六个部分;它们是

  • PyTorch 中的神经网络模型
  • 模型输入
  • 层、激活函数和层属性
  • 损失函数和模型优化器
  • 模型训练和推理
  • 模型检查

PyTorch 中的神经网络模型

PyTorch 可以做很多事情,但最常见的用例是构建深度学习模型。最简单的模型可以使用 Sequential 类来定义,它只是一个串联连接的层的线性堆栈。您可以创建一个 Sequential 模型并一次性定义所有层;例如:

您应该将所有层按从输入到输出的处理顺序定义在括号内。例如:

另一种使用 Sequential 的方法是传递一个有序字典,您可以在其中为每个层分配名称:

如果您想逐个构建层而不是一次性完成所有操作,可以这样做:

在需要根据某些条件构建模型的情况下,您会发现这很有用。

模型输入

模型中的第一层指示了输入的形状。在上面的例子中,第一层是 nn.Linear(764, 100)。根据您使用的不同层类型,参数可能有不同的含义。但在这种情况下,它是一个 Linear 层(也称为密集层或全连接层),两个参数指示了该层的输入和输出维度。

请注意,批次的大小是隐式的。在此示例中,您应该将形状为 (n, 764) 的 PyTorch 张量传递给此层,并期望返回形状为 (n, 100) 的张量,其中 n 是批次大小。

想开始使用PyTorch进行深度学习吗?

立即参加我的免费电子邮件速成课程(附示例代码)。

点击注册,同时获得该课程的免费PDF电子书版本。

层、激活函数和层属性

PyTorch 中定义了许多种类的神经网络层。事实上,如果您愿意,可以轻松定义自己的层。以下是一些您可能会经常看到的常见层:

  • nn.Linear(input, output):全连接层
  • nn.Conv2d(in_channel, out_channel, kernel_size):2D 卷积层,在图像处理网络中很受欢迎
  • nn.Dropout(probability):Dropout 层,通常添加到网络中以引入正则化
  • nn.Flatten():将高维输入张量重塑为一维(每个批次中的每个样本)

除了层,还有激活函数。这些是应用于张量每个元素的函数。通常,您会获取层的输出并应用激活函数,然后将其作为输入馈送到后续层。一些常见的激活函数是:

  • nn.ReLU():ReLU(修正线性单元),当今最常见的激活函数
  • nn.Sigmoid()nn.Tanh():Sigmoid 和双曲正切函数,在旧文献中通常是首选
  • nn.Softmax():将向量转换为类似概率的值;在分类网络中很受欢迎

您可以在 PyTorch 的文档中找到所有不同层和激活函数的列表。

PyTorch 的设计非常模块化。因此,您在每个组件中不需要进行太多调整。以这个 Linear 层为例。您只能指定输入和输出形状,而不能指定其他详细信息,例如如何初始化权重。但是,几乎所有组件都可以接受两个附加参数:设备和数据类型。

PyTorch 设备指定该层将在何处执行。通常,您在 CPU 和 GPU 之间进行选择,或省略它让 PyTorch 决定。要指定设备,请执行以下操作(CUDA 表示支持的 NVIDIA GPU):

或者

数据类型参数(dtype)指定该层应操作的数据类型。通常是 32 位浮点数,并且通常您不想更改它。但如果您需要指定不同的类型,则必须使用 PyTorch 类型,例如:

损失函数和模型优化器

神经网络模型是一系列矩阵运算。独立于输入并保留在模型内的矩阵称为权重。训练神经网络将优化这些权重,使它们产生您想要的输出。在深度学习中,优化这些权重的算法是梯度下降。

梯度下降有许多变体。您可以准备一个模型优化器来做出选择。它不是模型的一部分,但在训练期间您会将其与模型一起使用。它的用法包括定义一个损失函数并使用优化器最小化损失函数。损失函数将提供一个距离分数来告诉您模型输出离您期望输出有多远。它将模型的输出张量与期望的张量进行比较,在不同上下文中称为标签真实值。由于它作为训练数据集的一部分提供,因此神经网络模型是监督学习模型。

在 PyTorch 中,您可以直接获取模型的输出张量并对其进行操作以计算损失。但您也可以利用 PyTorch 提供的函数来实现这一点,例如:

在此示例中,loss_fn 是一个函数,而 loss 是一个支持自动微分的张量。您可以通过调用 loss.backward() 来触发微分。

以下是 PyTorch 中一些常见的损失函数:

  • nn.MSELoss():均方误差,在回归问题中有用
  • nn.CrossEntropyLoss():交叉熵损失,在分类问题中有用
  • nn.BCELoss():二元交叉熵损失,在二分类问题中有用

创建优化器也很相似:

所有优化器都需要一个它需要优化的所有参数的列表。这是因为优化器是在模型外部创建的,您需要告诉它在哪里查找参数(即模型权重)。然后,优化器将获取 backward() 函数调用计算出的梯度,并根据优化算法将其应用于参数。

这是包含一些常见优化器列表:

  • torch.optim.Adam():Adam 算法(自适应矩估计)
  • torch.optim.NAdam():带有 Nesterov 动量的 Adam 算法
  • torch.optim.SGD():随机梯度下降
  • torch.optim.RMSprop():RMSprop 算法

您可以在 PyTorch 的文档中找到所有提供的损失函数和优化器的列表。您可以了解每个优化算法的数学公式,请参阅文档中相应优化器的页面。

模型训练和推理

PyTorch 没有专门用于模型训练和评估的函数。一个定义的模型本身就像一个函数。您传入一个输入张量并得到输出张量。因此,编写训练循环是您的责任。一个最小的训练循环如下所示:

如果您已经有了模型,您可以简单地执行 y_pred = model(X),然后使用输出张量 y_pred 用于其他目的。这就是您使用模型进行预测或推理的方式。然而,模型不期望单个输入样本,而是期望一个张量中的一批输入样本。如果模型要接受一个输入向量(即一维的),您应该向模型提供一个二维张量。通常,在推理情况下,您会特意创建一个包含单个样本的批次。

模型检查

一旦您有了模型,就可以通过打印它来检查它的内容:

例如,这将为您提供以下内容:

如果您想保存模型,可以使用 Python 的 pickle 库。但您也可以通过 PyTorch 访问它:

这样,您就将整个模型对象保存在了一个 pickle 文件中。您可以使用以下方式检索模型:

但是,保存模型的推荐方法是将模型设计保留在代码中,只保留权重。您可以通过以下方式做到这一点:

state_dict() 函数仅提取状态(即模型中的权重)。要检索它,您需要从头开始重建模型,然后像这样加载权重:

资源

您可以使用以下资源了解更多关于如何在 PyTorch 中创建简单神经网络和深度学习模型的信息:

在线资源

总结

在本文中,您了解了可用于创建人工神经网络和深度学习模型的 PyTorch API。具体来说,您学习了 PyTorch 模型的生命周期,包括:

  • 构建模型
  • 创建和添加层及激活函数
  • 准备模型进行训练和推理

开始使用PyTorch进行深度学习!

Deep Learning with PyTorch

学习如何构建深度学习模型

...使用新发布的PyTorch 2.0库

在我的新电子书中探索如何实现
使用 PyTorch进行深度学习

它提供了包含数百个可用代码自学教程,让你从新手变成专家。它将使你掌握:
张量操作训练评估超参数优化等等...

通过动手练习开启你的深度学习之旅


查看内容

2 条对在 PyTorch 中构建多层感知机模型的回复

  1. User 2023 年 10 月 30 日晚上 8:51 #

    损失函数不应该是 BCELoss() 而不是 CrossEntropyLoss() 吗?模型输出 Sigmoid() 概率,但 CrossEntropyLoss() 期望原始 logits 作为输入。

留下回复

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