首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么batch_normalization在tensorflow没有给出预期的结果?

为什么batch_normalization在tensorflow没有给出预期的结果?
EN

Stack Overflow用户
提问于 2017-12-22 08:29:44
回答 1查看 468关注 0票数 2

我希望在一个小的例子中看到batch_normalization层的输出,但是显然我做错了什么,所以我得到了与输入相同的输出。

代码语言:javascript
复制
import tensorflow as tf
import keras.backend as K
K.set_image_data_format('channels_last')

X = tf.placeholder(tf.float32,  shape=(None, 2, 2, 3))  #  samples are 2X2 images with 3 channels
outp =  tf.layers.batch_normalization(inputs=X,  axis=3)

x = np.random.rand(4, 2, 2, 3)  # sample set: 4 images

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    K.set_session(sess)
    a = sess.run(outp, feed_dict={X:x, K.learning_phase(): 0})
    print(a-x) # print the difference between input and normalized output

上述代码的输入和输出几乎相同。有人能向我指出这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-22 09:00:07

记住,batch_normalization在火车和测试时间的行为是不同的。在这里,你从来没有“训练”过你的批次归一化,所以它学到的移动平均值是随机的,但接近0,移动方差因子接近1,所以输出与输入几乎相同。如果您使用K.learning_phase(): 1,您将已经看到一些差异(因为它将使用批的平均值和标准差进行规范化);如果您首先学习了许多示例,然后对其他示例进行测试,您也会看到正常化的发生,因为学习到的均值和标准差不会是0和1。

为了更好地看到批处理规范的效果,我还建议您将输入乘以一个大的数字(例如100),这样您就可以在未规范化的向量和规范化的向量之间有一个明显的区别,这将帮助您测试正在发生的事情。

编辑:在您的代码中,似乎从未完成移动均值和移动方差的更新。您需要确保运行更新操作,如规范化的医生中所示。以下几行应该使它发挥作用:

代码语言:javascript
复制
outp =  tf.layers.batch_normalization(inputs=X,  axis=3, training=is_training, center=False, scale=False)

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    outp = tf.identity(outp)

下面是我的完整代码(我去掉了Keras,因为我不太了解它,但是您应该能够重新添加它)。

代码语言:javascript
复制
import tensorflow as tf
import numpy as np

X = tf.placeholder(tf.float32,  shape=(None, 2, 2, 3))  #  samples are 2X2 images with 3 channels
is_training = tf.placeholder(tf.bool,  shape=())  #  samples are 2X2 images with 3 channels
outp =  tf.layers.batch_normalization(inputs=X,  axis=3, training=is_training, center=False, scale=False)

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
    outp = tf.identity(outp)

x = np.random.rand(4, 2, 2, 3) * 100  # sample set: 4 images

init_op = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init_op)
    initial = sess.run(outp, feed_dict={X:x, is_training: False})
    for i in range(10000):
        a = sess.run(outp, feed_dict={X:x, is_training: True})
        if (i % 1000 == 0):
            print("Step %i: " %i, a-x) # print the difference between input and normalized output

    final = sess.run(outp, feed_dict={X: x, is_training: False})
    print("initial: ", initial)
    print("final: ", final)
    assert not np.array_equal(initial, final)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47938172

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档