【问题标题】:Tensorflow2.0 Keras: Is dropout disabled during testing by default?Tensorflow2.0 Keras:测试时是否默认禁用dropout?
【发布时间】:2019-09-05 15:02:57
【问题描述】:

我想知道在以下模型中,当我调用model.evaluate(...).时,dropout 是否会被禁用

layers = [tf.keras.layers.Dense(size, activation='relu')
                  for size in (20, 40, 20)]
layers.insert(1, tf.keras.layers.Dropout(0.2))
layers.append(tf.keras.layers.Dense(1, activation="sigmoid"))
model = tf.keras.models.Sequential(layers)
model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.0001),
    loss=tf.keras.losses.BinaryCrossentropy())
model.fit(...)
model.evaluate(...) #==> will dropout be deactivated here?

【问题讨论】:

    标签: python tensorflow keras tensorflow2.0


    【解决方案1】:

    是的,在推理时始终禁用 dropout (evaluate/predict)。

    【讨论】:

    • 感谢您的快速回答,也许这可以在 tensorflow2.0 的文档中更清楚
    • @JonathanR 不需要,这是Dropout的标准工作。
    • @MatiasValdenegro 纠正我,如果我错了,但在旧版本的 tensorflow 中,你必须自己关闭它,方法是用你的 feed_dict 输入一个 keep_prop 变量。这就是为什么我和其他可能习惯于旧 tf 版本的人可能会对此感到困惑的原因。
    【解决方案2】:

    根据文档:

    Call arguments:
        inputs: Input tensor (of any rank).
        training: Python boolean indicating whether the layer should behave in
          training mode (adding dropout) or in inference mode (doing nothing).
      """
    

    所以是的,测试时会禁用 dropout,这在逻辑上是正确的。 SpatialDropout 也是如此。

    请在下面找到指向文档的链接。 https://www.tensorflow.org/versions/r2.0/api_docs/python/tf/keras/layers/Dropout

    Tensorflow Keras API 使用学习阶段标志来识别我们是在训练还是在测试。学习阶段标志是一个布尔张量(0 = 测试,1 = 训练),将作为输入传递给在训练时和测试时使用不同行为的任何 Keras 函数。

    【讨论】:

    • 我不明白为什么这告诉我它在测试时已关闭?当我读到这篇文章时,我认为我必须在测试时通过某种 training=False 变量才能将其关闭。
    • 我同意文档中并不清楚。这就是我在解释中添加学习阶段标志的原因,因此 tensorflow 会检测您是在训练还是在测试,并相应地打开/关闭此标志。现在,如果您再读一遍,就会清楚地知道,在训练时添加了 dropout,而在推理过程中什么也不做。
    猜你喜欢
    • 2018-05-26
    • 2010-12-26
    • 1970-01-01
    • 2019-05-22
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 1970-01-01
    相关资源
    最近更新 更多