在推理时启用 dropout 并禁用 BatchNormalization

Posted

技术标签:

【中文标题】在推理时启用 dropout 并禁用 BatchNormalization【英文标题】:Enable dropout and disable BatchNormalization at inference 【发布时间】:2021-10-25 01:34:56 【问题描述】:

我想使用 Tensorflow 2.5 在训练和推理时启用 dropout。为此,我在模型中设置了参数 training = True 的 dropout 层。

layer = tf.keras.layers.Dropout(0.2, training = True)

然后我训练了我的模型,并使用以下代码进行了预测:

prediction = model(X_test, training = False)

我故意将 training = False 放在模型预测函数(模型调用函数)中,因为我也在使用 BatchNormalization 层,并且我不希望在推理期间启用它们(与 dropout 层不同)。但是,我不知道在模型预测函数中放置 training = False 是否还会将 dropout 层添加到 training = False (覆盖它)。当我使用 model(X_test, training = False) 时,您能否判断 dropout 在推理时是否仍然启用?如果没有,是否有办法在推理期间(同时)启用 dropout 和禁用 BatchNormalization?

【问题讨论】:

【参考方案1】:

在预测期间,Tensorflow 中的 dropout 是禁用的,它只能在训练期间通过设置参数 training=True 来启用。 要在推理期间启用 dropout,目前还没有直接的方法。 但是按照以下链接中提到的一些解决方法,您可以实现。 1 & 2.

Batch Normalization 在训练期间和训练后不执行相同的计算,它在训练期间使用批量统计数据和训练后的最终统计数据(即移动平均值的最终值)。 但是,如果你想改变这种行为,你需要有自定义层并根据你的需要设置训练标志。 下面是示例 sn-p。

class BatchNormalization(tf.keras.layers.Layer):
   [...]
   def call(self, inputs, training=None):
       [...]

【讨论】:

以上是关于在推理时启用 dropout 并禁用 BatchNormalization的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试在启用推理引擎的情况下编译 OpenCv 时,出现错误

在运行时启用/禁用 SwaggerUI

如何启用/禁用选择标签并通过淘汰赛发布(即使禁用)

Firebase:在验证时禁用帐户或在启用后发送验证

可以禁用会话存储/本地存储并启用 Cookies 吗?

在 IBAction 中禁用的 UIButton 重新启用自身