1. 首页
  2. 机器学习

如何通过Keras中的正则化来减少过度拟合

辍学正则化是对深度神经网络进行正则化的一种计算便宜的方法。

辍学是通过概率性地删除或“放弃”对某个层的输入来进行的,该输入可以是数据样本中的输入变量或来自上一层的激活。它具有模拟具有非常不同的网络结构的大量网络的效果,进而使网络中的节点通常对输入更为健壮。

在本教程中,您将发现Keras API,用于将辍学正则化添加到深度学习神经网络模型中。

完成本教程后,您将知道:

  • 如何使用Keras API创建辍学层。
  • 如何使用Keras API向MLP,CNN和RNN层添加辍学正则化。
  • 如何通过在现有模型中添加辍学正则化来减少过度拟合。

本教程分为三个部分:他们是:

  1. Keras中的辍学正则化
  2. 层上的辍学正则化
  3. 辍学正则化案例研究

Keras中的辍学正则化

Keras支持辍学正则化。

辍学核心层提供了Keras中最简单的辍学形式。

创建后,可以为图层指定丢包率,作为将图层的每个输入设置为零的概率。这与论文中的辍学率定义不同,后者的辍学率是指保留输入的概率。

因此,当建议论文的辍学率为0.8(保留80%)时,实际上这将是0.2的辍学率(将输入的20%设置为零)。

以下是创建一个具有50%的机会将输入设置为零的辍学层的示例。

 

层上的辍学正则化

辍学层被添加到现有层之间的模型中,并应用于前一层的输出,该输出被馈送到下一层。

例如,给定两个密集层:

我们可以在它们之间插入一个dropout层,在这种情况下,第一层的输出或激活已应用到它们的dropout,然后将其作为下一层的输入。

现在是第二层已应用了辍学。

辍学也可以应用于可见层,例如网络的输入。

这要求您定义以Dropout层为第一层的网络,并向该层添加input_shape参数以指定输入样本的预期形状。

让我们看一下如何对某些常见的网络类型使用辍学正则化。

MLP辍学正则化

下面的示例在两个密集的完全连接的层之间添加了缺失。

 

CNN退出规范化

可以在卷积层(例如Conv2D)之后和池化层(例如MaxPooling2D)之后使用Dropout。

通常,仅在池化层之后才使用dropout,但这只是一个粗略的试探法。

在这种情况下,将删除应用于特征图中的每个元素或单元。

在卷积神经网络中使用丢包的另一种方法是从卷积层删除整个特征图,然后在池化过程中不使用它们。这称为空间缺失(或“ SpatialDropout ”)。

相反,我们制定了一个新的辍学方法,我们将其称为SpatialDropout。对于给定的卷积特征张量[…] [我们]将压差值扩展到整个特征图。

—使用卷积网络进行有效的对象本地化,2015年。

Keras通过SpatialDropout2D图层(以及1D和3D版本)提供了Spatial Dropout。

 

RNN辍学正则化

下面的示例在两层之间添加了缺失:LSTM循环层和密集的完全连接层。

在本例中,此示例将压差应用于来自LSTM层的32个输出,这些输出作为输入提供给密集层。

或者,LSTM的输入可能会丢失。在这种情况下,对呈现给LSTM的每个样本中的每个时间步都应用了一个不同的滤除掩码。

还有一种替代方法可以对LSTM等递归层使用辍学。LSTM可以为样本内的所有输入使用相同的滤除掩码。跨样本时间步长的递归输入连接可以使用相同的方法。这种使用递归模型进行辍学的方法称为变分RNN。

所提出的技术(可变RNN […])在每个时间步(包括循环层)都使用相同的辍学掩码。[…]实现我们的近似推论与在RNN中实现丢弃相同,在每个时间步中丢弃相同的网络单元,随机丢弃输入,输出和循环连接。这与现有技术相反,在现有技术中,将在不同的时间步长丢弃不同的网络单元,并且不会对循环连接应用任何丢弃操作

Keras支持变RNNs经由在复发性层两个参数,即“(即跨越输入和复发性输入的样本的时间的步骤一致差)漏失”输入和“ recurrent_dropout ”复发性输入。

辍学正规化案例研究

在本节中,我们将演示如何使用丢包正则化来减少简单二进制分类问题上MLP的过拟合。

本示例提供了一个模板,用于将辍学正则化应用于您自己的神经网络,以解决分类和回归问题。

二进制分类问题

我们将使用一个标准的二元分类问题,该问题定义了两个二维的同心圆观测,每个类别一个圆。

每个观察值都有两个具有相同比例的输入变量,并且一个类的输出值为0或1。该数据集被称为“ circle ”数据集,因为绘制每个类时观察值的形状。

我们可以使用make_circles()函数生成有关此问题的观察结果。我们将为数据添加噪声,并为随机数生成器添加种子,以便每次运行代码时都生成相同的样本。

我们可以绘制数据集,其中将两个变量作为图形上的x和y坐标,并将类值作为观察值的颜色。

下面列出了生成数据集并将其绘制的完整示例。

运行该示例将创建一个散点图,该散点图显示每个类别中观测值的同心圆形状。我们可以看到点分散中的噪声,使圆变得不那么明显。

圆形散点图数据集,其颜色显示每个样本的类值

圆形散点图数据集,其颜色显示每个样本的类值

这是一个很好的测试问题,因为这些类不能用一条线分开,例如不能线性地分开,因此需要诸如神经网络之类的非线性方法来解决。

我们仅生成了100个样本,对于神经网络而言这是很小的,这提供了过度拟合训练数据集并在测试数据集上具有更高误差的机会:这是使用正则化的一个很好的案例。此外,样本具有噪声,使模型有机会学习样本的未归纳方面。

过拟合的多层感知器

我们可以开发一个MLP模型来解决此二进制分类问题。

该模型将具有一个隐藏层,其中隐藏的节点数比解决该问题所需的节点数更多,从而提供了过度拟合的机会。我们还将训练模型的时间比确保模型过拟合所需的时间更长。

在定义模型之前,我们将数据集分为训练集和测试集,使用30个示例训练模型,并使用70个示例评估拟合模型的性能。

接下来,我们可以定义模型。

隐藏层在隐藏层中使用了500个节点,并使用了线性校正功能。在输出层中使用S形激活函数,以预测0或1的类值。

该模型使用二进制交叉熵损失函数进行了优化,适用于二进制分类问题和梯度下降的有效Adam版本。

然后将定义的模型拟合到4,000个训练时间的训练数据上,默认批次大小为32个。

我们还将使用测试数据集作为验证数据集。

我们可以评估模型在测试数据集上的性能并报告结果。

最后,我们将在每个时期的训练和测试集上绘制模型的性能。

如果模型确实确实适合训练数据集,我们会期望随着模型在训练数据集中学习到统计噪声,训练集上精度的直线图将继续增加,而测试集将上升然后再下降。

我们可以将所有这些部分捆绑在一起;下面列出了完整的示例。

运行示例将报告模型在训练和测试数据集上的性能。

我们可以看到,该模型在训练数据集上的性能比测试数据集更好,这是过度拟合的一种可能迹象。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。

由于模型严重过拟合,因此我们通常不会期望在同一数据集上重复运行模型时,准确性会有很大的差异。

将创建一个图,显示火车和测试集上模型精度的折线图。

我们可以看到过拟合模型的预期形状,其中测试精度会上升到一个点,然后又开始下降。

训练时显示过拟合的训练和测试数据集上的精度线图

训练时显示过拟合的训练和测试数据集上的精度线图

具有Dropout正则化的过拟合MLP

我们可以更新该示例以使用辍学正则化。

我们可以通过在隐藏层和输出层之间插入一个新的Dropout层来做到这一点。在这种情况下,我们将遗漏率(将隐藏层的输出设置为零的可能性)指定为40%或0.4。

下面列出了完整的更新示例,其中在隐藏层之后添加了dropout:

运行示例将报告模型在训练和测试数据集上的性能。

注意:由于算法或评估程序的随机性,或者数值精度的差异,您的结果可能会有所不同。考虑运行该示例几次并比较平均结果。

在这种特定情况下,我们可以看到,辍学导致训练数据集的准确性略有下降,从100%下降到96%,而测试集的准确性上升了,从75%上升到81%。

在训练过程中查看训练和测试准确性的折线图,我们可以看到模型不再适合训练数据集。

训练和测试集上的模型准确性都继续提高到一个稳定的水平,尽管在训练过程中由于使用了辍学而产生了很多噪音。

在使用辍学正则化进行训练时,训练和测试数据集上的精度线图

在使用辍学正则化进行训练时,训练和测试数据集上的精度线图

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站不拥有所有权,不承担相关法律责任。如发现有侵权/违规的内容, 联系QQ1841324605,本站将立刻清除。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

服务热线:130-0886-1890

QR code