Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow 为什么在测试模式期间,在tf.keras.layers.Dropout中设置training=True会导致更低的训练损失值和更高的预测精度?_Tensorflow_Tensorflow2.0_Dropout - Fatal编程技术网

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

Tensorflow 为什么在测试模式期间,在tf.keras.layers.Dropout中设置training=True会导致更低的训练损失值和更高的预测精度?,tensorflow,tensorflow2.0,dropout,Tensorflow,Tensorflow2.0,Dropout,我在tensorflow(tf.keras.layers.dropout)中实现的模型上使用了dropout层。我在培训期间设置“training=True”,在测试期间设置“training=False”。表演很差。在测试过程中,我也意外地更改了“training=True”,结果变得更好了。我想知道发生了什么事?为什么会影响训练损失值?因为我没有对训练做任何改变,整个测试过程都是在训练后进行的。然而,在测试中更改“training=True”会影响训练过程,导致训练损失接近于零,从而使测试结

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


谢谢,

很抱歉回复太晚,但塞利乌斯的回答不太正确

辍学
层(以及
批量标准化
层)的训练参数定义了该层应在训练模式还是推理模式下工作。你可以在官方网站上看到

但是,文档中对这如何影响网络的执行有点不清楚。设置
training=False
并不意味着退出层不是您网络的一部分。正如塞利乌斯所解释的,它决不会被忽略,但它只是在推理模式中发挥作用。对于辍学,这意味着不适用辍学。对于BN,这意味着BN将使用训练期间估计的参数,而不是为每个小批量计算新参数。这真是太棒了。另一方面,如果设置
training=True
,则层将在训练模式下运行,并应用退出


现在谈谈你的问题:你的人际网络的行为毫无意义。如果辍学是针对看不见的数据,那就没有什么可学的了。你只会丢掉信息,因此你的结果会更糟。但我认为你的问题与
退出层无关。您的网络是否也使用了
BatchNormalization
层?如果BN应用得不好,它可能会弄乱你的最终结果。但是我没有看到任何代码,所以很难完全回答您的问题。

可能与您分享的问题是关于论点本身的。我在问更多关于它向我展示的行为。如果我在测试期间将其设置为真,将导致损失值接近0,并提高测试精度!我相信问题的答案提供了回答问题所需的信息。我相信您熟悉BatchNormalization和Dropout,因此这些都是正则化技术,可以在测试期间获得更好的性能。这意味着更高的精确度和更低的损失。那么这是否意味着您可以在训练和测试模式中设置“training=True”?我认为您必须(或至少有意义)在培训期间设置“training=True”,在测试阶段设置“training=False”。顺便说一句,我编辑了我的问题标题,以使我的问题与您共享的类似问题之间的区别更加清楚。感谢您的回答,删除我的答案以避免混淆。