Keras 3 API 文档 / 层 API / 归一化层 / BatchNormalization 层

批量归一化层

[源代码]

BatchNormalization

keras.layers.BatchNormalization(
    axis=-1,
    momentum=0.99,
    epsilon=0.001,
    center=True,
    scale=True,
    beta_initializer="zeros",
    gamma_initializer="ones",
    moving_mean_initializer="zeros",
    moving_variance_initializer="ones",
    beta_regularizer=None,
    gamma_regularizer=None,
    beta_constraint=None,
    gamma_constraint=None,
    synchronized=False,
    **kwargs
)

该层对其输入进行归一化。

批量归一化应用一种变换,使输出的平均值接近 0,输出的标准差接近 1。

重要的是,批量归一化在训练和推理期间的工作方式不同。

在训练期间(即当使用 fit() 或使用参数 training=True 调用层/模型时),该层使用当前输入批次的均值和标准差对其输出进行归一化。也就是说,对于每个被归一化的通道,该层返回 gamma * (batch - mean(batch)) / sqrt(var(batch) + epsilon) + beta,其中

  • epsilon 是一个小的常数(可在构造函数参数中配置)。
  • gamma 是一个可学习的缩放因子(初始化为 1),可以通过将 scale=False 传递给构造函数来禁用。
  • beta 是一个可学习的偏移因子(初始化为 0),可以通过将 center=False 传递给构造函数来禁用。

在推理期间(即当使用 evaluate()predict() 或使用参数 training=False 调用层/模型时(这是默认设置)),该层使用在训练期间看到的批次的均值和标准差的移动平均值对其输出进行归一化。也就是说,它返回 gamma * (batch - self.moving_mean) / sqrt(self.moving_var+epsilon) + beta

self.moving_meanself.moving_var 是不可训练的变量,每次在训练模式下调用该层时都会更新,如下所示

  • moving_mean = moving_mean * momentum + mean(batch) * (1 - momentum)
  • moving_var = moving_var * momentum + var(batch) * (1 - momentum)

因此,该层仅在经过与推理数据具有相似统计特性的数据训练后,才会在推理期间对其输入进行归一化。

参数

  • axis: 整数,应归一化的轴(通常是特征轴)。例如,在使用 data_format="channels_first"Conv2D 层之后,使用 axis=1
  • momentum: 移动平均的动量。
  • epsilon: 添加到方差中的小浮点数,以避免除以零。
  • center: 如果为 True,则将 beta 偏移量添加到归一化张量。如果为 False,则忽略 beta
  • scale: 如果为 True,则乘以 gamma。如果为 False,则不使用 gamma。当下一层是线性层时,可以禁用此项,因为缩放将由下一层完成。
  • beta_initializer: beta 权重的初始化器。
  • gamma_initializer: gamma 权重的初始化器。
  • moving_mean_initializer: 移动平均值的初始化器。
  • moving_variance_initializer: 移动方差的初始化器。
  • beta_regularizer: beta 权重的可选正则化器。
  • gamma_regularizer: gamma 权重的可选正则化器。
  • beta_constraint: beta 权重的可选约束。
  • gamma_constraint: gamma 权重的可选约束。
  • synchronized: 仅适用于 TensorFlow 后端。如果为 True,则在分布式训练策略中,在每个训练步骤中,跨所有设备同步该层的全局批次统计信息(均值和方差)。如果为 False,则每个副本使用其自己的本地批次统计信息。
  • **kwargs: 基础层关键字参数(例如 namedtype)。

调用参数

  • inputs: 输入张量(任意秩)。
  • training: Python 布尔值,指示层应在训练模式还是推理模式下运行。
    • training=True:该层将使用当前输入批次的均值和方差对其输入进行归一化。
    • training=False:该层将使用在训练期间学习的移动统计信息的均值和方差对其输入进行归一化。
  • mask: 可广播到 inputs 张量的形状的二元张量,其中 True 值指示应计算均值和方差的位置。当前输入的掩码元素在训练期间不计入均值和方差计算。任何先前的未掩码元素值都将被考虑在内,直到它们的动量过期。

参考

关于在 BatchNormalization 层上设置 layer.trainable = False

设置 layer.trainable = False 的含义是冻结该层,即其内部状态在训练期间不会改变:其可训练权重在 fit()train_on_batch() 期间不会更新,并且其状态更新不会运行。

通常,这不一定意味着该层在推理模式下运行(这通常由在调用层时可以传递的 training 参数控制)。“冻结状态”和“推理模式”是两个独立的概念。

然而,在 BatchNormalization 层的情况下,在层上设置 trainable = False 意味着该层将随后在推理模式下运行(这意味着它将使用移动平均值和移动方差来归一化当前批次,而不是使用当前批次的均值和方差)。

注意

  • 在包含其他层的模型上设置 trainable 将递归设置所有内部层的 trainable 值。
  • 如果在对模型调用 compile() 后更改了 trainable 属性的值,则新值不会对此模型生效,直到再次调用 compile()