keras 使用哪个轴来规范化三维数据?

kqhtkvqz  于 2023-08-06  发布在  其他
关注(0)|答案(1)|浏览(82)

我想知道哪个轴更适合用于三维数据的归一化(默认情况下是最后一个轴)。例如,我有一个形状为3 x 4 x 5batch_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)

字符串

bfnvny8b

bfnvny8b1#

跨特征轴执行层归一化。我不确定你的axis=1是什么,但是,因为你有多维数据,我假设这是一个(空间?)特性。所以在您的例子中,您应该使用该选项向函数传递一个列表

tf.keras.layers.LayerNormalization(axis=[1, 2])

字符串
一些背景可以找到here,其中说:
[...]假设我们有表示(B,H,W,C)的4DTensor,它代表图像的批次,高度,宽度和通道。

批次范数→取通道(1,1,1,c)的均值和方差
层范数→取批次(b,1,1,1)的平均值和方差
示例范数→取批次/通道(b,1,1,c)的均值和方差

相关问题