【问题标题】:Why would moving_mean and moving _variance in Tensorflow BN layer become nan when I set is_training=False in training time?为什么当我在训练时设置 is_training=False 时,Tensorflow BN 层中的moving_mean 和moving _variance 会变成nan?
【发布时间】:2020-06-18 04:16:38
【问题描述】:

在训练的时候,我想保持BN层不变,所以我把is_training=False传给:

tf.contrib.layers.batch_norm(tensor_go_next, decay=0.9, center=True, scale=True, epsilon=1e-9,
                                              updates_collections=tf.GraphKeys.UPDATE_OPS,
                                              is_training=False, scope=name_bn_scope)

并且没有将name_bn_scope/gamma:0 name_bn_scope/beta:0 用于训练 var_list。

经过训练,gamma 和 beta 还是一样的,这正是我想要的。但是moving_mean和moving_variance在训练后会变成nan矩阵,导致0.1%的准确率。

我不明白为什么,is_taining=False 不强制张量流保持moving_mean 和moving _variance 不变?我该如何解决和实施这个问题?

BN层折磨了我这么久, 请帮帮我!

【问题讨论】:

    标签: python tensorflow keras slim batch-normalization


    【解决方案1】:

    啊哈,我想通了:下面的代码块应该注释掉!(用于强制Tensorflow在train_op运行时改变bn层的moving_mean/moving_variance。因为我不想在训练中改变它们,那么它应该被删除。)

    update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
    with tf.control_dependencies(update_ops):
        train_op = optimizer.minimize(loss, name = 'train_op', var_list = var_list_to_train)
    

    我还了解到,当陷入错误时,也许出去休息一下是找出如何定位错误然后解决它的最佳方法,这有点像深度学习中的技巧来摆脱局部最小值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-20
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 2018-02-01
      • 1970-01-01
      相关资源
      最近更新 更多