正規化層

[原始碼]

Normalization 類別

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

一個正規化連續特徵的預處理層。

此層會將輸入平移和縮放成一個以 0 為中心、標準差為 1 的分佈。它通過預先計算數據的平均值和變異數,並在執行時呼叫 (輸入 - 平均值) / sqrt(變異數) 來實現此目的。

此層的平均值和變異數必須在建構時提供,或透過 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)>