Normalization 层

[源代码]

Normalization

tf_keras.layers.Normalization(
    axis=-1, mean=None, variance=None, invert=False, **kwargs
)

一个对连续特征进行归一化的预处理层。

此层将输入进行移位和缩放,使其分布以 0 为中心,标准差为 1。它通过预计算数据的均值和方差,并在运行时调用 (input - mean) / sqrt(var) 来实现这一目标。

层的均值和方差值必须在构造时提供,或者通过 adapt() 进行学习。adapt() 将计算数据的均值和方差,并将其存储为层的权重。adapt() 应在调用 fit()evaluate()predict() 之前调用。

有关预处理层的概述和完整列表,请参阅预处理 指南

参数

  • axis:整数、整数元组或 None。应为每个形状索引拥有独立均值和方差的轴或轴。例如,如果形状为 (None, 5)axis=1,则该层将跟踪最后一个轴的 5 个独立均值和方差值。如果将 axis 设置为 None,该层将使用标量均值和方差对输入中的所有元素进行归一化。当为 -1 时,假定输入的最后一个轴是特征维度,并按索引进行归一化。请注意,在批处理标量输入且唯一轴是批处理轴的特定情况下,默认值将单独对批处理中的每个索引进行归一化。在这种情况下,请考虑传入 axis=None。默认为 -1
  • mean:归一化期间使用的均值。传入的值将广播到上方保留轴的形状;如果值无法广播,则在该层的 build() 方法被调用时将引发错误。
  • variance:归一化期间使用的方差。传入的值将广播到上方保留轴的形状;如果值无法广播,则在该层的 build() 方法被调用时将引发错误。
  • invert:如果为 True,则此层将对其输入应用逆变换:它会将归一化后的输入恢复到其原始形式。

示例

通过在 adapt() 中分析数据集来计算全局均值和方差。

>>> adapt_data = np.array([1., 2., 3., 4., 5.], dtype='float32')
>>> input_data = np.array([1., 2., 3.], dtype='float32')
>>> layer = tf.keras.layers.Normalization(axis=None)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
<tf.Tensor: shape=(3,), dtype=float32, numpy=
array([-1.4142135, -0.70710677, 0.], dtype=float32)>

为最后一个轴上的每个索引计算均值和方差。

>>> adapt_data = np.array([[0., 7., 4.],
...                        [2., 9., 6.],
...                        [0., 7., 4.],
...                        [2., 9., 6.]], dtype='float32')
>>> input_data = np.array([[0., 7., 4.]], dtype='float32')
>>> layer = tf.keras.layers.Normalization(axis=-1)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=
array([-1., -1., -1.], dtype=float32)>

直接传入均值和方差。

>>> input_data = np.array([[1.], [2.], [3.]], dtype='float32')
>>> layer = tf.keras.layers.Normalization(mean=3., variance=2.)
>>> layer(input_data)
<tf.Tensor: shape=(3, 1), dtype=float32, numpy=
array([[-1.4142135 ],
       [-0.70710677],
       [ 0.        ]], dtype=float32)>

使用该层对输入进行反归一化(在适应了该层之后)。

>>> adapt_data = np.array([[0., 7., 4.],
...                        [2., 9., 6.],
...                        [0., 7., 4.],
...                        [2., 9., 6.]], dtype='float32')
>>> input_data = np.array([[1., 2., 3.]], dtype='float32')
>>> layer = tf.keras.layers.Normalization(axis=-1, invert=True)
>>> layer.adapt(adapt_data)
>>> layer(input_data)
<tf.Tensor: shape=(1, 3), dtype=float32, numpy=
array([2., 10., 8.], dtype=float32)>