Tensorflow批量标准化:tf.contrib.layers.batch_norm

时间:2017-12-23 14:20:29

标签: tensorflow machine-learning deep-learning conv-neural-network

我最近选择了Tensorflow并且一直在努力适应环境。它一直都很精彩!但是,使用tf.contrib.layers.batch_norm进行批量规范化有点棘手。 现在,这是我正在使用的功能:

def batch_norm(x, phase):
    return tf.contrib.layers.batch_norm(x,center = True, scale = True,
                    is_training = phase, updates_collections = None)

使用这个,我跟踪了我在网上发现的大部分文档(也是Q& A),它使我得出以下结论:

1)is_training应该设置为True用于训练,false用于测试。这很有道理!训练时,我有收敛(误差<1%,Cifar 10 Dataset)。

然而,在测试期间,我的结果非常糟糕(错误> 90%)除非我添加(更新集合=无)作为上面的批量规范函数的参数。只有将其作为参数,测试才能给出我预期的错误。

我也肯定会使用以下内容进行培训:

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):                                       # Ensures, Updating ops will perform before training
    with tf.name_scope('Cross_Entropy'):
        cross_entropy = tf.reduce_mean(                                         # Implement Cross_Entropy to compute the softmax activation
            tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv))  # Cross Entropy: True Output Labels (y_), Softmax output (y_conv)
        tf.summary.scalar('cross_entropy', cross_entropy)                       # Graphical output Cross Entropy

    with tf.name_scope('train'):
        train_step = tf.train.AdamOptimizer(1e-2).minimize(cross_entropy)       # Train Network, Tensorflow minimizes cross_entropy via ADAM Optimization 

    with tf.name_scope('Train_Results'):
        with tf.name_scope('Correct_Prediction'):
            correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))  # Check if prediction is wrong with tf.equal(CNN_result,True_result)
        with tf.name_scope('Accuracy'):
            accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))     # Find the percent accuracy, take mean of correct_prediction outputs
            tf.summary.scalar('accuracy', accuracy)                                # Graphical output Classification Accuracy

这应该确保在训练期间批量标准化参数正在更新。

所以这让我相信update collections = None只是我的批量规范化功能的一个很好的默认值,在测试功能期间肯定不会调整任何批量规范化参数....我是否正确?

最后:在测试阶段,批量标准化打开和关闭时,获得良好结果(预期错误)是否正常?使用上面的批量规范函数,我能够很好地训练(is_training = True)并且测试得很好(is_training = False)。但是,在测试期间(is_training = True),我仍然能够获得很好的结果。这只是给我一种不好的感觉。有人可以解释为什么会这样吗?或者它应该发生什么?

感谢您的时间!

2 个答案:

答案 0 :(得分:2)

移动平均线的不稳定decay速率(默认为0.999)可能是合理良好的训练性能但验证/测试性能差的原因。尝试稍低decay率(0.99或0.9)。另外,请尝试zero_debias_moving_mean=True以提高稳定性。

您还可以尝试不同的批量大小,并查看验证性能是否会提高。使用批量标准化时,较大的批量大小会破坏验证性能。请参阅this

答案 1 :(得分:0)

你的阶段变量,张量流布尔值还是Python布尔值?