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

批归一化层

[source]

BatchNormalization class

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().