tensorflow - 为什么在测试模式下在 tf.keras.layers.Dropout 中设置 training=True 会导致更低的训练损失值和更高的预测精度?

标签 tensorflow tensorflow2.0 dropout

我在 tensorflow (tf.keras.layers.Dropout) 中实现的模型上使用了 dropout 层。我在训练期间设置了“training=True”,在测试时设置了“training=False”。性能很差。我也在测试过程中不小心更改了“training=True”,结果变得更好了。我想知道发生了什么?为什么它会影响训练损失值?因为我没有对培训进行任何更改,整个测试过程都在培训之后进行。但是,在测试中改变“training=True”正在影响训练过程,导致训练损失接近于零,然后测试结果会更好。有什么可能的解释吗?

谢谢,

最佳答案

很抱歉回复晚了,但 Celius 的回答不太正确。

Dropout 层(以及 BatchNormalization 层)的训练参数定义该层应该在训练模式还是推理模式下运行。您可以在官方documentation中阅读。 .

但是,关于这如何影响您的网络的执行,文档并不清楚。设置 training=False 并不意味着 Dropout 层不是您网络的一部分。它决不会像 Celius 解释的那样被忽略,但它只是在推理模式下运行。对于 Dropout,这意味着不会应用任何 dropout。对于 BN,这意味着 BN 将使用训练期间估计的参数,而不是为每个 mini-batch 计算新参数。这真的是。反过来,如果您设置 training=True,该层将在训练模式下运行并应用 dropout。

现在回答您的问题:您的网络行为没有意义。如果将 dropout 应用于看不见的数据,则无法从中学到任何东西。您只会丢弃信息,因此您的结果应该更糟。但我认为你的问题无论如何都与 Dropout 层无关。您的网络是否也使用 BatchNormalization 层?如果 BN 的应用不当,可能会弄乱您的最终结果。但是我没有看到任何代码,所以很难按原样完全回答你的问题。

关于tensorflow - 为什么在测试模式下在 tf.keras.layers.Dropout 中设置 training=True 会导致更低的训练损失值和更高的预测精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58862621/

相关文章:

tensorflow - 如何使用自定义优化器加载 keras 保存的模型

python - Tensorflow 2 中 tf.variable 的条件赋值

python-3.x - 是否有某种方法可以在 tensorflow v2 上加载在 tf v1 中创建的 .pb 文件?

Keras Dropout 层模型预测

python - 加载 SavedModel 比加载 tf.train.Saver 检查点慢很多

python - 有人可以解释这个 log_normal_pdf 术语对 tensorflow VAE 演示代码的含义吗?

TensorFlow 不使用 Nvidia

tensorflow - 检查目标 : expected dense_Dense2 to have shape x, 时出错,但得到形状为 y 的数组

python - 零丢包率的丢包层

python - 两个 Conv 层之间的 Dropout 和 Batchnormalization