【问题标题】:Tensorflow batch normalization: difference momentum and renorm_momentumTensorflow 批量归一化:差分动量和 renorm_momentum
【发布时间】:2018-03-28 07:23:02
【问题描述】:

我想在张量流中使用千层面库复制网络构建。我在批量标准化方面遇到了一些麻烦。 这是有关使用的批量标准化的千层面文档: 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

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

  1. 我不清楚动量和 renorm_momentum 之间的区别。如果我在千层面网络中的 alpha 为 0.9,我可以将两个 tensorflow 动量都设置为 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)

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

【问题讨论】:

    标签: tensorflow neural-network batch-normalization


    【解决方案1】:

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

    1. renorm_momentum 唯一的作用是通过将renorm 参数设置为True 来使用batch renormalization。如果使用默认批量标准化,您可以忽略这一点。
    2. 简短回答:您可以直接复制该代码 sn-p。把它放在你通常会打电话给optimizer.minimize的地方。

    关于 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 参数进行批量标准化,以便按预期使用小批量统计数据或移动平均值。

    【讨论】:

    • 感谢您的详细解答!小的后续问题,以确保我正确理解它:为了训练网络,我将 'training=true' 作为参数提供给 batch_norm 层。现在不会使用移动平均线,但它会随着每批更新,假设我做了 update_ops 的东西。当我想测试网络时,我会给 batch_norm 层提供“training=false”。现在使用最后更新的移动平均线,但不再更新。这是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 2017-08-16
    • 2018-08-16
    • 2019-01-13
    • 2019-06-16
    • 2018-04-05
    • 2017-07-01
    • 2018-04-09
    • 2018-06-08
    相关资源
    最近更新 更多