當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


Python tf.keras.layers.LayerNormalization用法及代碼示例


層歸一化層(Ba et al., 2016)。

繼承自:LayerModule

用法

tf.keras.layers.LayerNormalization(
    axis=-1, epsilon=0.001, center=True, scale=True,
    beta_initializer='zeros', gamma_initializer='ones',
    beta_regularizer=None, gamma_regularizer=None, beta_constraint=None,
    gamma_constraint=None, **kwargs
)

參數

  • axis 整數或列表/元組。要標準化的軸或軸。通常這是特征軸/軸。 left-out 軸通常是批處理軸/軸。此參數默認為 -1 ,即輸入中的最後一個維度。
  • epsilon 小浮點數添加到方差中以避免除以零。默認為 1e-3
  • center 如果為 True,則將 beta 的偏移量添加到歸一化張量。如果為 False,則忽略 beta。默認為真。
  • scale 如果為真,乘以 gamma 。如果為 False,則不使用 gamma。默認為真。當下一層是線性的(例如 nn.relu )時,可以禁用此函數,因為縮放將由下一層完成。
  • beta_initializer Beta 權重的初始化程序。默認為零。
  • gamma_initializer 伽馬權重的初始化器。默認為一個。
  • beta_regularizer beta 權重的可選正則化器。默認情況下無。
  • gamma_regularizer 伽馬權重的可選正則化器。默認情況下無。
  • beta_constraint Beta 權重的可選約束。默認情況下無。
  • gamma_constraint 伽馬權重的可選約束。默認情況下無。

在一個批次中獨立地對每個給定示例的前一層的激活進行歸一化,而不是像 Batch Normalization 那樣跨批次進行歸一化。即應用一個變換,保持每個示例中的平均激活接近 0,激活標準偏差接近 1。

給定張量 inputs ,計算矩並在 axis 中指定的軸上執行歸一化。

例子:

data = tf.constant(np.arange(10).reshape(5, 2) * 10, dtype=tf.float32)
print(data)
tf.Tensor(
[[ 0. 10.]
 [20. 30.]
 [40. 50.]
 [60. 70.]
 [80. 90.]], shape=(5, 2), dtype=float32)
layer = tf.keras.layers.LayerNormalization(axis=1)
output = layer(data)
print(output)
tf.Tensor(
[[-1. 1.]
 [-1. 1.]
 [-1. 1.]
 [-1. 1.]
 [-1. 1.]], shape=(5, 2), dtype=float32)

請注意,使用層歸一化,歸一化發生在每個示例中的軸上,而不是批處理中的不同示例。

如果啟用了 scalecenter,則該層將通過使用可訓練變量 gamma 廣播它們來縮放標準化輸出,並通過使用可訓練變量 beta 廣播來居中輸出。 gamma 將默認為一個張量,beta 將默認為一個零張量,因此在訓練開始之前居中和縮放是no-ops。

因此,啟用縮放和居中後,歸一化方程如下:

讓小批量的中間激活為 inputs

對於inputs 中具有k 特征的每個樣本x_i,我們計算樣本的均值和方差:

mean_i = sum(x_i[j] for j in range(k)) / k
var_i = sum((x_i[j] - mean_i) ** 2 for j in range(k)) / k

然後計算歸一化的 x_i_normalized ,包括一個小因子 epsilon 以實現數值穩定性。

x_i_normalized = (x_i - mean_i) / sqrt(var_i + epsilon)

最後 x_i_normalizedgammabeta 線性變換,它們是學習參數:

output_i = x_i_normalized * gamma + beta

gammabeta 將跨越 axis 中指定的 inputs 的軸,並且必須完全定義這部分輸入的形狀。

例如:

layer = tf.keras.layers.LayerNormalization(axis=[1, 2, 3])
layer.build([5, 20, 30, 40])
print(layer.beta.shape)
(20, 30, 40)
print(layer.gamma.shape)
(20, 30, 40)

請注意,層規範化的其他實現可能會選擇在一組單獨的軸上定義 gammabeta,而這些軸與被規範化的軸不同。例如,組大小為 1 的組標準化(Wu et al. 2018)對應於跨高度、寬度和通道標準化的層標準化,並且 gammabeta 僅跨越通道維度。因此,此層規範化實現將不匹配組大小設置為 1 的組規範化層。

輸入形狀:

隨意的。將此層用作模型中的第一層時,請使用關鍵字參數input_shape(整數元組,不包括樣本軸)。

輸出形狀:

與輸入的形狀相同。

參考:

相關用法


注:本文由純淨天空篩選整理自tensorflow.org大神的英文原創作品 tf.keras.layers.LayerNormalization。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。