Tensorflow 批量归一化:动量差和 renorm_momentum

Tensorflow batch normalization: difference momentum and renorm_momentum

我想在张量流中使用 lasagne-library 复制网络构建。我在批量规范化方面遇到了一些麻烦。 这是关于使用的批量归一化的烤宽面条文档: http://lasagne.readthedocs.io/en/latest/modules/layers/normalization.html?highlight=batchNorm

在 tensorflow 中我找到了两个要归一化的函数:

  1. https://www.tensorflow.org/api_docs/python/tf/nn/batch_normalization
  2. https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization

第一个更简单,但不允许我从烤宽面条中选择 alpha 参数(batch-wise 指数移动平均值的系数和训练期间计算的标准差)。我尝试使用第二个函数,它有更多的选项,但有两件事我不明白:

  1. 我不清楚动量和renorm_momentum的区别。如果千层面网络中的 alpha 为 0.9,我是否可以将两个张量流动量都设置为 0.9 并期待相同的行为?
  2. tf 文档注释:

训练时,需要更新moving_mean和moving_variance。默认情况下,更新操作放在 tf.GraphKeys.UPDATE_OPS 中,因此需要将它们添加为 train_op 的依赖项。例如:

  update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss)

我不太明白这里发生了什么以及我需要在我的代码中放置类似内容的地方。我可以把它放在 运行 和 session 之前的某个地方吗?这段代码的哪些部分我不应该按字面意思复制,而是根据我的代码进行更改?

tf.nn.batch_normalizationtf.layers.batch_normalization有很大区别。参见 。因此,您使用 layers 版本做出了正确的选择。现在,关于您的问题:

  1. renorm_momentum 仅在您通过将 renorm 参数设置为 True 来使用 batch renormalization 时有效。如果使用默认的批量归一化,你可以忽略它。
  2. 简短回答:您可以直接复制该代码片段。把它放在你通常调用 optimizer.minimize.
  3. 的地方

关于 2 的长答案:批量归一化有两个 "modes":训练和推理。在训练期间,使用当前小批量的均值和方差。在推理过程中,这是不可取的(例如,您甚至可能不使用批次作为输入,因此不会有小批量统计信息)。出于这个原因,在训练期间保留了 minibatch means/variances 的移动平均值。然后使用这些移动平均线进行推理。
默认情况下,Tensorflow 只执行它需要执行的操作。训练不需要这些移动平均线,因此它们通常永远不会 executed/updated。 tf.control_dependencies 上下文管理器强制 Tensorflow 在每次计算代码块中的内容(在本例中为成本)时进行更新。由于每个训练步骤都需要精确计算成本,因此这是确保更新移动平均线的好方法。

代码示例似乎有点神秘,但在上下文中它实际上只是(作为示例):

loss = ...
train_step = SomeOptimizer().minimize(loss)
with tf.Session() as sess:
    ....

变成

loss = ...
with tf.control_dependencies(tf.get_collection(tf.GraphKeys.UPDATE_OPS)):
    train_step = SomeOptimizer().minimize(loss)
with tf.Session() as sess:
    ....

最后,请记住使用正确的 training 参数进行批量归一化,以便按预期使用小批量统计或移动平均数。