如何通过批量归一化来归一化所有轴?

据我了解,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]: 所有结果为零


紫衣仙女
浏览 222回答 2
2回答

白板的微信

这可以通过层标准化来实现:>>> 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)与批归一化的区别在于,层归一化将操作分别应用于批次中的每个单元。如果您想对批处理执行此操作,请选择批处理规范。同样,这通过将轴设置为列表来工作。

MMMHUHU

不幸的是,我认为使用batch_normalizationtensorflow API的层/功能是不可行的。正如函数名称所暗示的,它旨在执行“批量”归一化,因此预计在给定当前批次(通常为 0 维)的特征轴上进行归一化。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python