但是当 training=True 时正在训练什么?
让我们首先尝试理解 BatchNormalization(BN) 层,因为它有更多的元素。
TL;DR -
γ, β是学习的。它们像正常权重一样被初始化并在反向传播中学习。
可以在这些 parm Stat.SE
上阅读这个清晰而准确的答案
形式上,BN 根据以下表达式转换给定层 x 的激活:
BN(x)= γ⊙(x−μ)/σ + β
坐标缩放系数 γ 和偏移量 β。
[引用-http://d2l.ai/ ]
每个 BN 层每个输入添加四个参数:γ、β、μ 和 σ(例如,第一个 BN 层添加 3,136 个参数,即 4 × 784)。最后两个参数 μ 和 σ 是移动平均线;它们不受反向传播的影响,因此 Keras 称它们为“不可训练的”。但是,它们是在训练期间根据训练数据进行估计的,因此可以说它们是可训练的。在 Keras 中,“不可训练”实际上意味着“不受反向传播影响”。”
[引用 - 使用 scikit-learn keras 和 tensorflow 进行机器学习,Aurélien Géron
training=True:该层将使用当前批次输入的均值和方差对其输入进行归一化。
training=False:该层将使用在训练期间学习的移动统计数据的均值和方差对其输入进行归一化。[引用 - BN 的 Keras 文档]
因此,如果您不将其设置为False,它将继续使用每批测试数据示例更新μ 和 σ ,并相应地标准化输出。我们希望它使用训练阶段的值。
默认情况下,它是 False 并且 fit 方法将其设置为 True。
辍学
辍学是两者中更简单的。我们在这里需要这个标志,以便我们可以补偿(在测试期间)由于关闭(在训练期间)神经元而导致的输出值损失(在平均基础上)。
假设 p = 50%,在这种情况下,在测试期间,一个神经元连接到的输入神经元数量将是训练期间(平均)的两倍。为了弥补这一事实,我们需要在训练后将每个神经元的输入连接权重乘以 0.5。如果我们不这样做,每个神经元将获得大约两倍于网络训练的总输入信号,并且不太可能表现良好。更一般地,我们需要将每个输入连接权重乘以训练后的保持概率 (1 - p)。或者,我们可以将每个神经元的输出除以训练期间的保持概率(这些替代方法并不完全等价,但它们的效果同样好)
[引用 - 使用 scikit-learn keras 和 tensorflow 进行机器学习,Aurélien Géron
以模型差异为例
不过,这些都是要尝试和检查的主题。
但我相信,当我们认为上层被平滑以与初始层匹配时,我们通常会开始微调,以避免前向和背景中的大流量。因此,在 2019 年示例中保持其 Flase 的逻辑可能不会每次都保持得太强。