【问题标题】:How to normalize all axis with batch normalization?如何通过批量归一化来归一化所有轴?
【发布时间】:2019-04-16 12:27:05
【问题描述】:

据我了解,对于tf.layers.batch_normalization,我定义的轴是标准化的轴。

简单地说:

给定这些值

a = [[0, 2], 
     [1, 4]]

形状为 (2, 2),因此轴 0 和 1。

对轴 1 进行归一化意味着将轴 0 减少到其平均值和标准差,然后将这些值用于归一化。

因此

bn = tf.layers.batch_normalization(a, axis=[1])

会有(几乎)相同的结果

m, v = tf.nn.moments(a, axes=[0])
bn = (a - m) / tf.sqrt(v)

但是我将如何为所有轴执行tf.layers.batch_normalization

使用之前的平均值和标准差计算会很容易:

m, v = tf.nn.moments(a, axes=[0, 1])
bn = (a - m) / tf.sqrt(v)

但是如何通过批量标准化来做到这一点?

bn = tf.layers.batch_normalization(a, axis=[???])

我尝试了以下不起作用:

  • axis = None: AttributeError: 'BatchNormalization' object has no attribute 'axis'
  • axis = []: IndexError: list index out of range
  • axis = [0, 1]:所有结果都为零

【问题讨论】:

  • 这种批量标准化的用例/优势是什么?归一化不应该首先沿着特征轴吗?
  • @NihalSangeeth 您可以规范化您需要的每个轴。这一切都取决于您的数据的外观和它所代表的内容。是的,通常在特征轴上进行归一化,但这并不排除在任何其他维度上进行归一化。

标签: python tensorflow batch-normalization


【解决方案1】:

不幸的是,我认为使用 tensorflow API 的 batch_normalization 层/函数是不可行的。

正如函数名称所暗示的,它旨在执行“批量”归一化,因此预计在给定当前批次(通常为 0 维)的情况下对特征轴进行归一化。

【讨论】:

  • 您可能是对的,该实现不允许在所有轴上进行标准化。但是您答案的第二部分不正确。批量标准化仅意味着按批次计算均值、标准差以及 beta 和 gama。这与规范化过程本身无关。它也没有预定义任何轴。是的,通常在特征轴上进行归一化(通常为 -1 或 1;0 轴是批处理轴)。但这并不意味着其他用例不会在其他轴上进行批量标准化。
【解决方案2】:

这可以通过layer normalization实现:

>>> data = tf.constant(np.arange(10).reshape(5, 2) * 10, dtype=tf.float32)
    layer = tf.keras.layers.LayerNormalization(axis=[0, 1])
    output = layer(data)
    print(output)

tf.Tensor(
[[-1.5666981  -1.2185429 ]
 [-0.8703878  -0.5222327 ]
 [-0.17407757  0.17407756]
 [ 0.52223265  0.8703878 ]
 [ 1.2185429   1.5666981 ]], shape=(5, 2), dtype=float32)

与批归一化的区别在于层归一化将操作分别应用于批次中的每个单元。

如果您想对批处理执行此操作,请选择批处理规范。同样,这可以通过将轴设置为列表来实现。

【讨论】:

    猜你喜欢
    • 2019-01-13
    • 2018-03-28
    • 2017-08-16
    • 2021-05-27
    • 1970-01-01
    • 2020-10-23
    • 2020-04-04
    • 2019-06-16
    • 1970-01-01
    相关资源
    最近更新 更多