我想知道哪个轴更适合用于三维数据的归一化(默认情况下是最后一个轴)。例如,我有一个形状为3 x 4 x 5
(batch_size x number_of_elements x number_of_features
)的Tensor。在这种情况下,我应该使用轴1来规范化每个特征还是默认轴-1(2)?:
data = tf.constant(np.arange(3 * 4 * 5).reshape(3, 4, 5) * 10, dtype=tf.float32)
print(data)
tf.Tensor(
[[[ 0. 10. 20. 30. 40.]
[ 50. 60. 70. 80. 90.]
[100. 110. 120. 130. 140.]
[150. 160. 170. 180. 190.]]
[[200. 210. 220. 230. 240.]
[250. 260. 270. 280. 290.]
[300. 310. 320. 330. 340.]
[350. 360. 370. 380. 390.]]
[[400. 410. 420. 430. 440.]
[450. 460. 470. 480. 490.]
[500. 510. 520. 530. 540.]
[550. 560. 570. 580. 590.]]], shape=(3, 4, 5), dtype=float32)
layer = tf.keras.layers.LayerNormalization(axis=1)
output = layer(data)
print(output)
tf.Tensor(
[[[-1.3416405 -1.3416405 -1.3416406 -1.3416405 -1.3416405 ]
[-0.44721347 -0.44721353 -0.44721353 -0.44721353 -0.4472134 ]
[ 0.44721353 0.44721353 0.4472134 0.44721353 0.44721365]
[ 1.3416405 1.3416405 1.3416405 1.3416406 1.3416407 ]]
[[-1.3416407 -1.3416407 -1.3416407 -1.3416405 -1.3416405 ]
[-0.44721365 -0.44721365 -0.44721365 -0.44721317 -0.44721317]
[ 0.44721317 0.44721317 0.44721317 0.44721365 0.44721365]
[ 1.3416405 1.3416405 1.3416405 1.341641 1.3416405 ]]
[[-1.341641 -1.341641 -1.341641 -1.341641 -1.34164 ]
[-0.44721413 -0.44721413 -0.44721413 -0.44721413 -0.44721317]
[ 0.44721317 0.44721317 0.44721317 0.44721317 0.44721413]
[ 1.3416405 1.3416405 1.3416405 1.3416405 1.3416414 ]]], shape=(3, 4, 5), dtype=float32)
字符串
1条答案
按热度按时间bfnvny8b1#
跨特征轴执行层归一化。我不确定你的axis=1是什么,但是,因为你有多维数据,我假设这是一个(空间?)特性。所以在您的例子中,您应该使用该选项向函数传递一个列表
字符串
一些背景可以找到here,其中说:
[...]假设我们有表示(B,H,W,C)的4DTensor,它代表图像的批次,高度,宽度和通道。
批次范数→取通道(1,1,1,c)的均值和方差
层范数→取批次(b,1,1,1)的平均值和方差
示例范数→取批次/通道(b,1,1,c)的均值和方差