我试图在 Tensorflow 中构建一个通用的批量规范化函数。
我学习了article中的批量规范化,我觉得非常友好。
我对比例和 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
答案 0 :(得分:1)
来自tf.nn.batch_normalization
的文档:
均值,方差,偏移和比例都预计为两个中的一个 形状:
一般来说,它们可以具有相同数量的维度 输入x,尺寸与x相同,尺寸不相同 标准化('深度'维度)和维度1 正在规范化的其他人。在这种情况下的均值和方差 通常是tf.nn.moments(...,keep_dims = True)的输出 在训练期间,或在推理期间运行平均值。
在 常见的情况是'深度'维度是最后一个维度 输入张量x,它们可以是相同大小的一维张量 作为'深度'尺寸。例如,对于普通人来说就是这种情况 [批次,深度]完全连接层的布局,以及[批次,高度, 卷积的宽度,深度]。在这种情况下的均值和方差 通常是tf.nn.moments(...,keep_dims = False)的输出 在推理期间进行训练或运行平均值。
使用您的值(scale = 1.0和offset = 0),您也可以只提供值None
。