0

我正在尝试在Tensorflow中构建一个通用的批量标准化函数。

我在这篇文章中学习了批量标准化,我觉得这很友好。

我对比例beta变量的维度有疑问:在我的情况下,批量标准化应用于每个卷积层的每个激活,因此,如果我将卷积层的输出作为大小为:

[57,57,96]

我需要比例beta与卷积层输出具有相同的维度,对吗?

这是我的功能,程序可以工作,但我不知道是否正确

def batch_normalization_layer(batch):
   # Calculate batch mean and variance
    batch_mean, batch_var = tf.nn.moments(batch, axes=[0, 1, 2])

    # Apply the initial batch normalizing transform
    scale = tf.Variable(tf.ones([batch.get_shape()[1],batch.get_shape()[2],batch.get_shape()[3]]))
    beta = tf.Variable(tf.zeros([batch.get_shape()[1],batch.get_shape()[2],batch.get_shape()[3]]))

    normalized_batch = tf.nn.batch_normalization(batch, batch_mean, batch_var, beta, scale, 0.0001)

    return normalized_batch
4

1 回答 1

1

从以下文档tf.nn.batch_normalization

mean、variance、offset 和 scale 都应该是以下两种形状之一:

一般来说,它们可以具有与输入 x 相同数量的维度,对于未归一化的维度(“深度”维度)具有与 x 相同的大小,对于其他正在被归一化的维度具有相同的大小。规范化了。在这种情况下,均值和方差通常是训练期间 tf.nn.moments(..., keep_dims=True) 的输出,或者是推理期间的运行平均值。

在“深度”维度是输入张量 x 中的最后一个维度的常见情况下,它们可能是与“深度”维度大小相同的一维张量。例如,全连接层的常见 [batch, depth] 布局和卷积的 [batch, height, width, depth] 就是这种情况。在这种情况下,均值和方差通常是训练期间 tf.nn.moments(..., keep_dims=False) 的输出,或者是推理期间的运行平均值。

使用您的值(scale=1.0 和 offset=0),您也可以只提供 value None

于 2017-04-14T17:34:10.723 回答