具有更多隐藏神经元的神经网络

传统的神经网络模型称为多层感知器。它们通常由一系列相互连接的层组成。输入层是数据进入网络的入口,输出层是网络输出结果的地方。

输入层通常连接到一个或多个隐藏层,这些隐藏层在数据到达输出层之前对其进行修改和处理。隐藏层是使神经网络如此强大的原因:它们可以学习复杂的函数,而这些函数可能很难由程序员在代码中指定。

在上一个教程中,我们构建了一个只有几个隐藏神经元的神经网络。在这里,您将通过向其中添加更多隐藏神经元来构建一个神经网络。这将为我们估计更复杂的函数以拟合数据。

在实现过程中,您将学到:

  • 如何在 PyTorch 中构建具有更多隐藏神经元的神经网络。
  • 如何通过向网络添加更多隐藏神经元来使用神经网络估计复杂函数。
  • 如何在 PyTorch 中训练神经网络。

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


让我们开始吧。

拥有更多隐藏神经元的神经网络。
图片来自 Kdwk Leung。部分权利保留。

概述

本教程分为三个部分;它们是

  • 准备数据
  • 构建模型架构
  • 训练模型

准备数据

让我们构建一个 `Data` 类,它继承自 PyTorch 的 `Dataset` 类。您可以使用它来创建包含 100 个介于 -50 到 50 之间的合成值的数据集。 `x` 张量存储指定范围内的值,而 `y` 张量是具有与 `x` 相同形状的对应零张量。

接下来,您将使用一个 for 循环,根据 `x` 中的值来设置 `x` 和 `y` 张量中的值。如果 `x` 中的一个值在 -20 和 20 之间,则 `y` 中的相应值设置为 1;如果 `x` 中的一个值在 -30 和 -20 之间,或者在 20 和 30 之间,则 `y` 中的相应值设置为 0。同样,如果 `x` 中的一个值在 -40 和 -30 之间,或者在 30 和 40 之间,则 `y` 中的相应值设置为 1。否则,`y` 中的相应值设置为 0。

在 `Data` 类中,`__getitem__()` 方法用于检索数据集中指定索引处的 `x` 和 `y` 值。`__len__()` 方法返回数据集的长度。使用它们,您可以通过 `data[i]` 从数据集中获取一个样本,并通过 `len(data)` 获取数据集的大小。此类可用于创建可以传递给 PyTorch 数据加载器来训练机器学习模型的数据对象。

请注意,我们正在构建这个复杂的数据对象,以查看我们的具有更多隐藏神经元的神经网络对函数的估计效果如何。数据对象的代码如下所示。

实例化一个数据对象。

并编写一个函数来可视化此数据,该函数在稍后训练模型时也很有用。

运行此函数后,您可以看到数据如下图所示。


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

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

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

构建模型架构

下面,您将定义一个 `NeuralNetwork` 类,使用 PyTorch 的 `nn.Module` 来构建自定义模型架构。此类代表一个简单的神经网络,包含输入层、隐藏层和输出层。

`__init__()` 方法用于通过定义网络中的层来初始化神经网络。forward 方法用于定义通过网络的正向传播。在这种情况下,对输入层和输出层都应用了 sigmoid 激活函数。这意味着网络的输出将是 0 到 1 之间的值。

最后,您将创建一个 `NeuralNetwork` 类的实例并将其存储在 `model` 变量中。该模型初始化为具有 1 个输入神经元的输入层、15 个隐藏神经元的隐藏层和 1 个输出神经元的输出层。该模型现在已准备好在某些数据上进行训练。

训练模型

让我们定义损失函数、优化器和数据加载器。由于数据集是二分类问题,因此应使用二元交叉熵损失。使用 Adam 优化器,批次大小为 32。学习率设置为 0.01,它决定了在训练期间如何更新模型权重。损失函数用于评估模型性能,优化器用于更新权重,数据加载器将数据分成批次以进行有效处理。

现在,让我们构建一个为期 7000 个 epoch 的训练循环,并在训练期间可视化结果。您将看到随着训练的进行,我们的模型如何很好地估计数据点。

当您运行此循环时,您会发现在第一个 epoch,神经网络对数据集的建模效果很差,如下图所示:

但随着训练的进行,准确率有所提高。训练循环完成后,我们可以看到结果,神经网络对数据的建模如下所示:

以及相应的损失度量历史记录可以绘制如下:

正如你所见,我们的模型相当好地估计了该函数,但并非完美。例如,20到40范围内的输入预测得并不准确。你可以尝试扩展网络,添加一个额外的层,例如下面这样,看看是否会有所不同。

把所有东西放在一起,下面是完整的代码。

总结

在本教程中,您学习了如何通过在神经网络中引入更多神经元来估计复杂函数。特别是,您学习了

  • 如何在 PyTorch 中构建具有更多隐藏神经元的神经网络。
  • 如何通过向网络添加更多隐藏神经元来使用神经网络估计复杂函数。
  • 如何在 PyTorch 中训练神经网络。

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

Deep Learning with PyTorch

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

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

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

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

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


查看内容

“神经元更多的神经网络”的一项回复

  1. Mohammed 2023 年 1 月 11 日上午 6:56 #

    如何选择隐藏层的数量?

留下回复

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