卷积神经网络 - Dropout 会影响性能

Posted

技术标签:

【中文标题】卷积神经网络 - Dropout 会影响性能【英文标题】:Convolutional Neural Network - Dropout kills performance 【发布时间】:2017-11-25 11:33:47 【问题描述】:

我正在使用 Tensorflow 构建一个卷积神经网络(我都是新手),以便识别字母。我的 dropout 层有一个非常奇怪的行为:如果我不放它(即 keep_proba 为 1),它会表现得非常好并且可以学习(请参阅下面的 Tensorboard 的准确性和损失截图,蓝色训练和测试橙色)。

但是,当我在训练阶段放置 dropout 层时(我尝试使用 0.8 和 0.5),网络什么也没学到:损失在 3 或 4 左右迅速下降并且不再移动(我还注意到我的网络总是预测相同的值,与输入图像无关)。相同的图表:

这种奇怪行为的原因可能是什么?我读过 dropout 是避免过度拟合的好方法。我用错了吗?

如果有用的话,这是我的网络架构: CONVOLUTION -> MAX_POOL -> RELU -> CONVOLUTION -> MAX_POOL -> RELU -> FC 1024 neurons -> DROPOUT -> OUTPUT LAYER.

非常感谢任何帮助或想法。

【问题讨论】:

你能确定你只是添加了一个dropout层并且没有编辑任何其他参数。添加一些代码 sn-ps 会有所帮助。您也可以尝试更改全连接层中的神经元。您是否在最后一层使用softmax 激活? 尝试在 RELU 和 conv 之间移动 dropout,如果失败,那么您的代码中可能存在一些错误。 这没有意义,请出示你的代码 我不允许发布代码 sry,但它与 tutorial,“构建多层卷积网络”部分中的代码非常接近 @MatiasValdenegro 是的,我就是这么做的,我的 dropout 是在具有 1024 个神经元的全连接层之后。 【参考方案1】:

Dropout 是一种正则化技术,它通过根据 dropout 率在训练时概率性地移除神经元,使网络更稳健地拟合数据。它可以成为缓解神经网络中数据过度拟合的强大工具。

对于“使用多少” dropout 正则化,实际上并没有硬性规定。使用正确的训练数据,您可能根本不需要任何 dropout,而在其他情况下,它的缺失将导致严重的过度拟合病态。在您的情况下,似乎 50% 或 80% 的辍学率可能过高(过度正则化通常会导致拟合不足)。

过拟合病理的典型指标是训练集和测试集之间的差异(通常,两者都会改善一段时间,但随后训练误差将继续下降,而测试误差开始向相反方向发展) .虽然您的训练误差明显小于测试误差,但测试误差在训练期间不会恶化(这将是过度拟合的明确指标)。 可能仍然有一些机会来权衡一些训练误差,以获得更好的样本外预测误差(这通常是最终目标)和适度的 dropout。知道这一点的唯一方法是使用更适度的辍学率进行测试(我会从 20% 之类的值开始并围绕该值进行测试)以查看训练错误是否有所改善(如果没有,您可以进一步降低辍学率)。在最好的情况下,您的样本外测试错误会变得更好,但会增加一些训练错误(或训练错误收敛速度较慢)。但是,如果您过度正则化,您会看到两者的退化(这在第二组图中非常明显)。

正如其他人所指出的,您可能会发现 dropout 正则化在卷积层中更有效(或者不是,如果不尝试就很难说)。模型结构和所有超参数设置的空间太大而无法有效搜索,并且没有太多的理论指导我们的选择。一般来说,最好从已证明可有效解决类似问题(基于已发布的结果)的配方开始,然后从那里进行测试和实验。

能够有效地使用神经网络与学习从训练测试指标中识别这些动态有很大关系,这将使您能够根据模型结构或超参数(包括辍学率)的变化来识别改进。

【讨论】:

以上是关于卷积神经网络 - Dropout 会影响性能的主要内容,如果未能解决你的问题,请参考以下文章

卷积神经网络-Dropout

在 Keras 的卷积层上使用 Dropout

PyTorch 卷积网络正则化 DropBlock

卷积层在神经网络中如何运算?

卷积层在神经网络中如何运算?

卷积神经网络(原理与代码实现)