<p>The are all based on the same paper: <a href="http://arxiv.org/abs/1502.03167" rel="nofollow noreferrer">http://arxiv.org/abs/1502.03167</a>
So they should do the same thing.</p>

<p>Some functions move around the code but the old versions are kept to keep backwards compatibility and you end up with more than one version.</p>

<p>I would recommend using the simplest one that lets you do your project (that is tf.nn.batch_normalization). If you need features/parameters that are not offered pick the one that works for you.</p>

<p>Note:
tf.contrib.* is not guarateed to remain backwards compatible (the api might change in a future version).</p>
What is the difference between the TensorFlow batch normalization implementations?
<p>TensorFlow seems to implement at least 3 versions of batch normalization:</p>

<ul>
<li><a href="https://www.tensorflow.org/api_docs/python/tf/nn/batch_normalization" rel="nofollow noreferrer"><code>tf.nn.batch_normalization</code></a></li>
<li><a href="https://www.tensorflow.org/api_docs/python/tf/layers/batch_normalization" rel="nofollow noreferrer"><code>tf.layers.batch_normalization</code></a></li>
<li><a href="https://www.tensorflow.org/api_docs/python/tf/contrib/layers/batch_norm" rel="nofollow noreferrer"><code>tf.contrib.layers.batch_norm</code></a></li>
</ul>

<p>These all have different arguments and documentation.</p>

<p>What is the difference between these, and which one should I use?</p>