我在 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/