根据tensorflow
附加组件中组归一化的文档说明,当组数设置为1时,组归一化层应成为层归一化。
然而,当我在一个测试张量上调用这些层时,结果却有所不同。看起来组归一化层不仅在时间轴上计算均值和方差,也在通道轴上计算,而层归一化则独立地为每个通道的向量计算这些值。
这是个错误还是我遗漏了什么?当前层归一化的行为实际上对我正在做的事情是有利的。
这是GroupNormalization的文档:
In [5]: x = tf.constant([[[1, 2], [3, 40]], [[1 , -1], [2, 200]]], dtype = tf.float32)In [6]: tf.keras.layers.LayerNormalization()(x) Out[6]: <tf.Tensor: shape=(2, 2, 2), dtype=float32, numpy=array([[[-0.99800587, 0.99800587], [-0.99999857, 0.99999857]], [[ 0.9995002 , -0.9995002 ], [-1. , 1. ]]], dtype=float32)>In [7]: tfa.layers.GroupNormalization(groups = 1)(x) Out[7]: <tf.Tensor: shape=(2, 2, 2), dtype=float32, numpy=array([[[-0.6375344 , -0.57681686], [-0.5160993 , 1.7304504 ]], [[-0.5734435 , -0.5966129 ], [-0.5618587 , 1.7319152 ]]], dtype=float32)>
回答:
根据TF 2.4.1
中tf.keras.layers.LayerNormalization
的文档,源码:
请注意,其他层归一化的实现可能会选择在与归一化轴不同的另一组轴上定义
gamma
和beta
。例如,组归一化(Wu et al. 2018)在组大小为1时,相当于跨高度、宽度和通道进行归一化的层归一化,并且gamma
和beta
仅跨越通道维度。因此,此层归一化实现将不匹配组大小设置为1的组归一化层。