Tensorflow 中的正确批量归一化功能是啥?

Posted

技术标签:

【中文标题】Tensorflow 中的正确批量归一化功能是啥?【英文标题】:What is right batch normalization function in Tensorflow?Tensorflow 中的正确批量归一化功能是什么? 【发布时间】:2018-06-08 15:56:19 【问题描述】:

在 tensorflow 1.4 中,我发现了两个执行批量标准化的函数,它们看起来一样:

    tf.layers.batch_normalization (link) tf.contrib.layers.batch_norm (link)

我应该使用哪个功能?哪个更稳定?

【问题讨论】:

【参考方案1】:

只是添加到列表中,还有更多方法可以在 tensorflow 中进行批处理规范:

tf.nn.batch_normalization 是一个低级操作。调用者自己负责处理 meanvariance 张量。 tf.nn.fused_batch_norm 是另一个低级操作,与上一个类似。不同之处在于它针对 4D 输入张量进行了优化,这是卷积神经网络中的常见情况。 tf.nn.batch_normalization 接受任何等级大于 1 的张量。 tf.layers.batch_normalization 是对先前操作的高级包装。最大的区别在于它负责创建和管理运行均值和方差张量,并在可能的情况下调用快速融合操作。通常,这应该是您的默认选择tf.contrib.layers.batch_norm 是批规范的早期实现,在它升级到核心 API 之前(即 tf.layers)。不建议使用它,因为它可能会在未来的版本中被删除。 tf.nn.batch_norm_with_global_normalization 是另一个已弃用的操作。目前,将呼叫委托给 tf.nn.batch_normalization,但将来可能会被放弃。 最后还有 Keras 层 keras.layers.BatchNormalization,在 TensorFlow 后端调用 tf.nn.batch_normalization 的情况下。

【讨论】:

谢谢。我接受了。我只是想问你关于均值和方差的问题。如您所述,我如何管理均值和方差?只是将 is_training 标志设置为 False? 管理我的意思是:创建正确形状的变量并从批次中累积运行均值/方差。这有点乏味,这就是为什么调用高级函数更容易的原因。在这种情况下,您只需要设置training 属性即可。 对于未来的读者,这篇文章很好地描述了如何手动管理均值/方差:r2rt.com/implementing-batch-normalization-in-tensorflow.html【参考方案2】:

如doc 所示,tf.contrib 是一个包含易失性或实验性代码的贡献模块。当function 完成时,它将从此模块中删除。现在有两个,为了兼容历史版本。

所以,推荐前tf.layers.batch_normalization

【讨论】:

以上是关于Tensorflow 中的正确批量归一化功能是啥?的主要内容,如果未能解决你的问题,请参考以下文章

第十八节,TensorFlow中使用批量归一化

如何在 LSTM 中实现 Tensorflow 批量归一化

在哪里对标准 CNN 应用批量归一化

Tensorflow2实现像素归一化与频谱归一化

神经网络中的批量归一化

Hulu机器学习问题与解答系列 | 二十三:神经网络训练中的批量归一化