当前位置: 首页 > 知识库问答 >
问题:

TensorFlow中的批量规范化

詹正浩
2023-03-14

在TensorFlow中执行批量规格化的正确方法是什么?(即,我不想计算连续均值和方差)。我当前的实现基于tf。nn。batch\u normalization(批次规格化),其中x是具有形状的卷积层的输出。[批次大小、宽度、高度、通道数]。我想在通道方面执行批处理规范。

batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])
x = tf.nn.batch_normalization(x, batch_mean, batch_var, offset=0, scale=0, variance_epsilon=1e-6)

但这种实施的结果非常糟糕。与tensorflow比较。承包商。苗条的batch\u norm显示其票价较低(同样糟糕的培训表现)。

我做错了什么,什么能解释这种糟糕的表现?

共有2个答案

翟越
2023-03-14

@Maosi的解决方案有效,但我发现它很慢。以下内容简单快速。

batch_mean, batch_var = tf.nn.moments(x, axes=[0, 1, 2])
x = tf.subtract(x, batch_mean)
x = tf.div(x, tf.sqrt(batch_var) + 1e-6)
终子昂
2023-03-14

您可以考虑tf。承包商。图层。layer\u norm。您可能需要将x重塑为[批次、通道、宽度、高度],并设置begin\u norm\u axis=2,以进行通道规格化(每个批次和每个通道将独立规格化)。

以下是如何将原始订单重塑为[批次、通道、宽度、高度]的示例:

import tensorflow as tf

sess = tf.InteractiveSession()

batch = 2
height = 2
width = 2
channel = 3

tot_size = batch * height * channel * width

ts_4D_bhwc = tf.reshape(tf.range(tot_size), [batch, height, width, channel])
ts_4D_bchw = tf.transpose(ts_4D_bhwc, perm=[0,3,1,2])

print("Original tensor w/ order bhwc\n")
print(ts_4D_bhwc.eval())

print("\nTransormed tensor w/ order bchw\n")
print(ts_4D_bchw.eval())

输出:

Original tensor w/ order bhwc

[[[[ 0  1  2]
   [ 3  4  5]]

  [[ 6  7  8]
   [ 9 10 11]]]


 [[[12 13 14]
   [15 16 17]]

  [[18 19 20]
   [21 22 23]]]]

Transormed tensor w/ order bchw

[[[[ 0  3]
   [ 6  9]]

  [[ 1  4]
   [ 7 10]]

  [[ 2  5]
   [ 8 11]]]


 [[[12 15]
   [18 21]]

  [[13 16]
   [19 22]]

  [[14 17]
   [20 23]]]]
 类似资料:
  • 我可以在输入层之后使用批处理规范化层而不规范化我的数据吗?我可以期望得到类似的效果/性能吗? 在keras函数中,它应该是这样的:

  • 但似乎每个tensorflow实现(包括这个和官方的tensorflow实现)都使用(指数)移动平均和方差。 请原谅我,但我不明白为什么。是不是因为使用移动平均值对性能更好?还是纯粹为了计算速度? 参考:原稿

  • 我正在查看TensorFlow中的官方批处理规范化层(BN),但它并没有真正解释如何将其用于卷积层。有人知道如何做到这一点吗?特别重要的是,它应用并学习每个特征映射(而不是每个激活)的相同参数。以其他顺序,它应用并学习每个过滤器的BN。 在一个特定的玩具示例中,我想用MNIST上的BN(基本上是2D数据)执行conv2d。因此,我们可以做到: 其中,z=BN(z)将BN应用于每个过滤器创建的每个特

  • 我使用Tensorflow 1.14.0和Keras 2.2.4。以下代码实现了一个简单的神经网络: 20个时代后的最终val\u损失为0.7751。当我取消注释添加批处理规范化层的唯一注释行时,val\u损失变为1.1230。 我的主要问题要复杂得多,但同样的事情也会发生。因为我的激活是线性的,所以我把批处理规范化放在激活之后还是之前并不重要。 问题:为什么批处理规范化帮不上忙?是否有什么可以更

  • 最初的问题是专门针对TensorFlow实现的。然而,答案是针对一般实现的。这个一般答案也是TensorFlow的正确答案。 在TensorFlow中使用批处理规范化和退出(特别是使用contrib.layers)时,我需要担心排序吗? 如果我在批处理规范化之后立即使用dropout,可能会有麻烦。例如,如果批量标准化中的移位训练到较大的训练输出标度编号,但在测试过程中,相同的移位应用到较小的(由

  • BatchNormalization层 keras.layers.normalization.BatchNormalization(epsilon=1e-06, mode=0, axis=-1, momentum=0.9, weights=None, beta_init='zero', gamma_init='one') 该层在每个batch上将前一层的激活值重新规范化,即使得其输出数据的均值接