神经网络

前馈神经网络-如何在Python中成功构建它们

一个使用真实数据的Python示例对神经网络进行详细的图形化解释

前馈神经网络。图像中作者

介绍

在过去的几年里,神经网络一直是中心话题。虽然它们最初看起来很吓人,但我向你保证,你不需要博士学位就能理解它们是如何工作的。

在本文中,我将带您了解基本神经网络(也称为前馈神经网络或多层感知器(mlp))背后的主要思想,并向您展示如何使用Tensorflow和Keras库在Python中构建它们。

内容

  • 前馈神经网络在机器学习领域的地位
  • 前馈神经网络如何工作的可视化解释
    -网络结构和术语
    -参数和激活功能
    -损失函数,优化器和训练
  • 如何构建和训练你自己的前馈神经网络的Python示例

前馈神经网络在机器学习领域的地位

机器学习是一个巨大的一个随着每天新算法的开发,空间不断扩大。我试图通过分类一些最常用的算法来给这个世界带来结构互动下面的图表。点击不同的分类来放大和揭示更多。

虽然这种分类并不完美,但它能让你大致了解不同的部分是如何组合在一起的,希望它也能促进你的数据科学学习之旅。

我把神经网络放在一个独特的类别中,认识到它们独特的机器学习方法。然而,重要的是要记住,神经网络最常用于解决使用标记训练数据的分类和回归问题。因此,另一种方法可能是将它们置于机器学习的监督分支之下。

机器学习算法分类。创建的交互式图表作者

如果你喜欢数据科学和机器学习,请订阅每次我发表新文章都会收到邮件

前馈神经网络如何工作的可视化解释

结构和术语

首先,让我们熟悉一下神经网络的基本结构。

前馈神经网络的基本结构。图像中作者
  • 输入层—包含一个或多个输入节点。例如,假设你想预测明天是否会下雨,并根据湿度和风速这两个变量做出决定。在这种情况下,你的第一个输入值是湿度,第二个输入值是风速。
  • 隐藏层-该层包含隐藏节点,每个节点包含一个激活函数(稍后会详细介绍)。请注意,具有多个隐藏层的神经网络被称为深度神经网络。
  • 输出层—包含一个或多个输出节点。按照上面相同的天气预测示例,您可以选择只有一个输出节点生成降雨概率(其中>0.5表示明天有雨,而≤0.5表示明天无雨)。或者,您可以有两个输出节点,一个用于下雨,另一个用于无雨。注意,您可以使用不同的激活函数用于输出节点与隐藏节点。
  • 连接-连接不同节点的线路称为连接。这些包含内核(权重)而且偏见,即神经网络训练过程中得到优化的参数。

参数和激活函数

让我们仔细看看内核(权重)和偏差,以理解它们的作用。为了简单起见,我们创建了一个基本的神经网络,它有一个输入节点、两个隐藏节点和一个输出节点(1-2-1)。

关于前馈(FF)神经网络中如何应用权重和偏差的详细视图。图像中作者
  • 内核(权重)- - - - - -用于缩放输入和隐藏节点值。每个连接通常具有不同的权重。
  • 偏见-用于在将缩放值传递给激活函数之前调整它们。
  • 激活功能-将激活函数视为神经网络用于创建自定义曲线以拟合训练数据的标准曲线(构建块)。通过网络传递不同的输入值,选择标准曲线的不同部分,然后组装成最终的定制曲线。

有许多激活函数可供选择Softplus线性整流函数(Rectified Linear Unit),乙状结肠是最常用的。下面是神经网络中常用的六个激活函数的形状和方程:

激活功能。图像中作者

现在我们已经熟悉了核(权重)、偏差和激活函数,让我们使用相同的神经网络来根据今天的湿度计算明天下雨的概率。

注意,我已经训练了这个神经网络(参见下面的Python部分).因此,我们已经知道了内核(权重)和偏差的值。下图向您展示了FF神经网络如何获取输入值并产生答案(输出值)的一步一步的过程。

前馈(FF)神经网络计算实例。图像中作者

如你所见,上面的神经网络告诉我们,今天50%的湿度意味着明天下雨的概率为33%。

损失函数、优化器和训练

训练神经网络涉及一个复杂的过程,称为反向传播.我不会一步一步地解释反向传播是如何工作的,因为这是一个足够大的主题,值得单独写一篇文章。

相反,让我简单地向你介绍损失函数和优化器,并总结当我们“训练”神经网络时会发生什么。

  • 损失之间的错误“大小”真正的值/标签和预测值/标签。训练神经网络的目标是最小化这种损失。损失越小,真实数据与预测数据的匹配度越高。有很多损失函数从…中选择,与BinaryCrossentropyCategoricalCrossentropy,MeanSquaredError是最常见的。
  • 优化器-是用于反向传播的算法.优化器的目标是找到最优的内核集(权重)和偏差,以使损失最小化。优化器通常使用梯度下降方法,这允许他们迭代地找到权重和偏差的“最佳”可能配置。最常用的是SGD亚当,RMSProp

训练一个神经网络基本上是通过训练数据拟合一个自定义曲线,直到它可以尽可能地近似它。下图说明了定制曲线在特定场景下的样子。这个示例包含一组数据,随着输入值的增加,这些数据似乎在0和1之间切换。

拟合曲线训练数据。图像中作者

一般来说,广泛的激活函数选择结合添加尽可能多的隐藏节点的能力(如果我们有足够的计算能力)意味着神经网络可以创建任何形状的曲线来拟合数据。

然而,这种极端的灵活性有时可能会导致数据过拟合。因此,在使用模型进行预测之前,我们必须始终确保在测试/验证集上验证模型。

总结我们所学的知识

前馈神经网络获取一个或多个输入值,并在通过激活函数传递结果之前,使用内核(权重)和偏差应用转换。最后,我们得到一个输出(预测),这是通过训练优化的复杂转换集的结果。

我们通过训练数据拟合自定义曲线来训练神经网络,以损失最小化为指导,并通过参数(内核和偏差)优化来实现。

用Python构建和训练前馈神经网络

现在让我们来找点乐子,建立我们自己的神经网络。我们将使用澳大利亚历史天气数据来训练神经网络,预测明天是否会下雨。

设置

我们需要以下数据和库:

让我们导入所有的库:

上面的代码打印了本例中使用的包版本:

Tensorflow / Keras: 2.7.0
熊猫:1.3.4
numpy: 1.21.4
sklearn: 1.0.1
情节:5.4.0

接下来,我们下载并摄取澳大利亚天气数据(来源:Kaggle).我们还做了一些简单的数据操作,并为我们的模型导出了新的变量。

数据是这样的:

一段Kaggle的澳大利亚天气数据做了一些修改。图像中作者

神经网络

现在我们训练和评估我们的前馈(FF)神经网络。我对下面的代码做了大量注释,以便让您清楚地了解每个部分的功能。因此,我不会在文章正文中重复同样的内容。

使用一个输入(Humidity3pm)

简而言之,我们是在用今天下午3点的湿度来预测明天是否下雨。我们的神经网络具有本文前面分析过的简单结构(1-2-1):一个输入节点,两个隐藏节点和一个输出节点。

有几点需要注意:

  • 下面的代码执行两次验证,一次是对X_train数据的一部分进行验证(请参阅步骤5中的validation_split),另一次是对步骤2中创建的测试示例进行验证。当然,不需要做两次,所以可以随意使用任何一种方法来验证您的模型。
  • 数据是不平衡的(晴天比雨天多),所以我在第5步中调整了classes_weight。
训练前馈神经网络。Gif图片作者。

上面的代码打印了我们1-2-1神经网络的以下总结和评估指标:

1-2-1前馈(FF)神经网络性能。图像中作者

注意,此模型的权重和偏差与本文前面计算示例中的权重和偏差不同。这是因为神经网络训练在优化器算法中使用随机(随机)方法。因此,每次重新训练你的模型都会有所不同。

现在让我们在图表上绘制预测曲线。

由单输入神经网络生成的预测曲线。图像中作者

使用两个输入(WindGustSpeed和humity3pm)

让我们看看当我们使用两个输入(WindGustSpeed和Humidity3pm)来训练一个具有2-2-1结构的神经网络时,网络和预测是如何变化的。

你可以在自己的时间随意试验,训练一个有17个输入和不同数量的隐藏节点的模型。

结果是:

2-2-1前馈(FF)神经网络模型性能。图像中作者

由于我们使用了两个输入,我们仍然可以将预测可视化。然而,这一次我们需要一个3D图表来做到这一点:

由两个输入的神经网络生成的曲面预测曲面。图像中作者

结论

神经网络并不像一开始看起来那么可怕。我真诚地希望你喜欢阅读这篇文章,并获得了一些新的知识。

请使用本文提供的代码来构建您自己的神经网络。此外,你可以找到完整的木星笔记本在我GitHub库

当我试图让我的文章对读者更有用时,如果你能告诉我是什么驱使你阅读这篇文章,以及它是否给了你想要的答案,我会很感激。如果没有,那么缺少了什么?

干杯!
扫罗Dobilas

揭秘数据科学和机器学习|加入https://solclover.com/membership|连接www.linkedin.com/in/saulius-dobilas推特@SolClover

Baidu
map