【问题标题】:Dropout when using Keras with TensorFlow backend将 Keras 与 TensorFlow 后端一起使用时的 Dropout
【发布时间】:2017-09-26 19:22:35
【问题描述】:

我读到了 Keras 的 dropout 实现,它似乎使用了它的反向 dropout 版本,即使它说的是 dropout。

这是我在阅读 Keras 和 Tensorflow 文档时所理解的:

当我指定Dropout(0.4) 时,0.4 意味着该层中的每个节点都有 40% 的机会被丢弃,这意味着 0.4 是丢弃概率。因此,通过反向 dropout 的概念,剩余神经元的输出被缩放 1/0.6 倍,因为保持概率为 0.6。

(如果我的解释不正确,请指出。我的全部疑问都是基于这种解释。)

另一方面,在 TensorFlow 中,它只是直接询问保持概率,这意味着如果我将值指定为 0.4,则每个节点都有 60% 的机会被丢弃。

那么当我在 Keras 的后端使用 TensorFlow 时会发生什么?保持或丢弃概率需要 0.4 吗?

(使用 Python 3.6 和所有必需库的最新版本)

【问题讨论】:

    标签: python-3.x tensorflow keras regularized


    【解决方案1】:

    Dropout(0.4) 在 Keras 层中意味着 40% 的神经元被丢弃(不保留)。

    来自Keras documentation

    Dropout 包括将输入单元的分数率随机设置为 在训练期间每次更新时为 0,这有助于防止 过拟合。

    【讨论】:

    • 我清楚地明白,正如您在问题中看到的那样,我指定的内容与您指定的内容完全相同。但这不是我要问的。 TensorFlow 实现了反向 dropout,但要求保持概率,所以如果我在 tensorflow 中说 dropout(0.4),则节点将有 60% 的机会被丢弃。我的问题:如果我在 Keras 的后端使用 TensorFlow 并指定 dropout(0.4) 那么节点是否有 40% 的机会被丢弃或 40% 的机会被保留?
    • 感谢您的评论。我想我正确地理解了你。我认为 Keras 是一个 API,它抽象了很多后端,以便提供一个统一的接口,而不管你的后端是什么。所以在几乎所有方面,无论你使用什么后端,你都不会注意到 Keras 模型的任何差异。但无论如何:一个简单的检查自己的方法是将 dropout 设置得非常高,比如 0.99 甚至 1.0。你会看到这个数量的神经元被丢弃(没有保留)。
    【解决方案2】:

    查看Dropout 层的source code (Line 72) 也可以帮助确定答案。

    Dropout 包括随机设置输入单元的分数“率” 在训练期间每次更新时为 0,这有助于防止 过拟合。

    消息来源还提到了由 Nitish Srivastava 等撰写的参考论文(我假设它准确地概述了 keras 如何实现 dropout)found here。人


    虽然阅读源代码有点多,但它看起来像是在第 107 行调用了 droput 的后端实现

    return K.dropout(inputs, self.rate, noise_shape, seed=self.seed)
    

    K 是后端。如果您仍然好奇,可能值得研究一下K.dropout 在您选择的后端是如何实现的。

    【讨论】:

    • 我在我的问题中提到 TensorFlow 实现了反向丢弃,但要求保留概率,即如果我说指定 0.4,那么该节点有 60% 的机会被丢弃。但另一方面,如果我在 keras 中指定相同的节点,则该节点有 40% 的机会被丢弃。所以如果我在 keras 的后端使用 TENSORFLOW 并指定 dropout(0.4) 那么该节点被丢弃 40% 或 60% 的概率是多少?
    • “Dropout 包括在训练期间的每次更新时将输入单元的分数“率”随机设置为 0,这有助于防止过度拟合。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 2019-10-01
    • 2020-07-13
    • 1970-01-01
    相关资源
    最近更新 更多