层归一化层(Ba et al., 2016)。
用法
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)
请注意,使用层归一化,归一化发生在每个示例中的轴上,而不是批处理中的不同示例。
如果启用了 scale
或 center
,则该层将通过使用可训练变量 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_normalized
由 gamma
和 beta
线性变换,它们是学习参数:
output_i = x_i_normalized * gamma + beta
gamma
和 beta
将跨越 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)
请注意,层规范化的其他实现可能会选择在一组单独的轴上定义 gamma
和 beta
,而这些轴与被规范化的轴不同。例如,组大小为 1 的组标准化(Wu et al. 2018)对应于跨高度、宽度和通道标准化的层标准化,并且 gamma
和 beta
仅跨越通道维度。因此,此层规范化实现将不匹配组大小设置为 1 的组规范化层。
输入形状:
随意的。将此层用作模型中的第一层时,请使用关键字参数input_shape
(整数元组,不包括样本轴)。
输出形状:
与输入的形状相同。
参考:
相关用法
- Python tf.keras.layers.Layer用法及代码示例
- Python tf.keras.layers.Layer.add_loss用法及代码示例
- Python tf.keras.layers.Layer.add_metric用法及代码示例
- Python tf.keras.layers.Layer.set_weights用法及代码示例
- Python tf.keras.layers.Layer.get_weights用法及代码示例
- Python tf.keras.layers.Lambda用法及代码示例
- Python tf.keras.layers.LocallyConnected1D用法及代码示例
- Python tf.keras.layers.LSTMCell用法及代码示例
- Python tf.keras.layers.LSTM用法及代码示例
- Python tf.keras.layers.LeakyReLU用法及代码示例
- Python tf.keras.layers.LocallyConnected2D用法及代码示例
- Python tf.keras.layers.InputLayer用法及代码示例
- Python tf.keras.layers.serialize用法及代码示例
- Python tf.keras.layers.Dropout用法及代码示例
- Python tf.keras.layers.maximum用法及代码示例
- Python tf.keras.layers.Conv2D用法及代码示例
- Python tf.keras.layers.RepeatVector用法及代码示例
- Python tf.keras.layers.Multiply用法及代码示例
- Python tf.keras.layers.Activation用法及代码示例
- Python tf.keras.layers.Conv1D用法及代码示例
注:本文由纯净天空筛选整理自tensorflow.org大神的英文原创作品 tf.keras.layers.LayerNormalization。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。