Tensorflow批量标准化:差异动量和renorm_momentum

时间:2018-03-28 07:23:03

标签: tensorflow neural-network batch-normalization

我想用张量流中的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
  3. 第一个更简单,但不允许我从千层面选择alpha参数(分批平均指数移动平均值的系数和训练期间计算的标准偏差)。我尝试使用第二个函数,它有更多选项,但有两件事我不明白:

    1. 我不清楚动量和renorm_momentum之间的区别。如果我在烤宽面条网络中的alpha为0.9,我可以将张量流量矩设置为0.9并期望相同的行为吗?
    2. 文件说明:
    3. 训练时,需要更新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)
      

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

1 个答案:

答案 0 :(得分:2)

tf.nn.batch_normalizationtf.layers.batch_normalization之间存在很大差异。见my answer here。因此,您使用layers版本做出了正确的选择。现在,关于你的问题:

  1. renorm_momentum只有通过将renorm参数设置为True才能使用batch renormalization。如果使用默认批量标准化,则可以忽略此项。
  2. 简短回答:您可以逐字复制该代码段。把它准确地放在通常称为optimizer.minimize的地方。
  3. 2的长答案:批量标准化有两种“模式”:训练和推理。在训练期间,使用当前小批量的均值和方差。在推理期间,这是不可取的(例如,您甚至可能不使用批次作为输入,因此不会有小批量统计信息)。出于这个原因,在训练期间保持移动平均值超过小批量意味着/方差。然后将这些移动平均线用于推断 默认情况下,Tensorflow仅执行所需的操作。培训不需要那些移动平均线,因此它们通常永远不会被执行/更新。 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参数进行批量规范化,以便按预期使用小批量统计信息或移动平均值。