在推理时启用 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的主要内容,如果未能解决你的问题,请参考以下文章