Tensorflow批量归一化: difference momentum and renorm_momentum

标签 tensorflow neural-network batch-normalization

我想用 tensorflow 中的烤宽面条库复制网络构建。我在批量标准化方面遇到了一些麻烦。 这是关于所使用的批量归一化的烤宽面条文档: 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 参数(训练期间计算的批量平均值和标准差的指数移动平均值的系数)。我尝试使用第二个函数,它有更多选项,但有两件事我不明白:

  1. 我不清楚momentum和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)

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

最佳答案

tf.nn.batch_normalization 和 tf.layers.batch_normalization 之间存在很大差异。请参阅my answer here 。因此,您使用 layers 版本做出了正确的选择。现在,回答您的问题:

  1. renorm_momentum 仅当您使用 batch renormalization 时才有效。通过将 renorm 参数设置为 True。如果使用默认批量归一化,您可以忽略这一点。
  2. 简短回答:您可以直接复制该代码片段。将其准确放置在您通常调用optimizer.minimize的位置。

关于 2 的长答案:批量归一化有两种“模式”:训练和推理。在训练期间,使用当前小批量的均值和方差。在推理过程中,这是不可取的(例如,您甚至可能不使用批处理作为输入,因此不会有小批量统计数据)。因此,在训练期间保留小批量均值/方差的移动平均值。然后将这些移动平均线用于推理。
默认情况下,Tensorflow 仅执行其需要的操作。训练不需要这些移动平均线,因此它们通常永远不会被执行/更新。 tf.control_dependency 上下文管理器强制 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:
    ....

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

关于Tensorflow批量归一化: difference momentum and renorm_momentum,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49528440/

相关文章:

python - 机器学习引擎 : Prediction Error while executing local predict command

neural-network - 什么是 NEAT(增强拓扑的神经进化)?

python - Tensorflow Inception_Resnet_V2 分类图像

python - 保存重新训练的 tensorflow 模型时出现问题

python - 为训练和验证数据提供张量

neural-network - 值错误: Tensor conversion requested dtype float32 for Tensor with dtype int32

python - Keras 功能 API 多输入模型

python - 无法在 Keras 2.1.0(使用 Tensorflow 1.3.0)中保存的 Keras 2.4.3(使用 Tensorflow 2.3.0)中加载 Keras 模型

Keras:批量归一化(axis=1)的等级为 0

python - 如何更好地预处理图像以获得更好的深度学习结果?