Batch normalization(BN)
BN是对输入的特征图进行标准化的操作,其公式为:
x^=γ(x−μ)/σ2+ϵ−−−−−√+β
- x - 原输入
x^ - 标准化后的输入- μ - 一个batch中的均值
- σ2 - 一个batch中的方差
- ϵ - 一个很小的数,防止除0
- β - 中心偏移量(center)
- γ - 缩放(scale)系数
tensorflow中提供了三种BN方法:
tf.nn.batch_normalization
tf.layers.batch_normalization
tf.contrib.layers.batch_norm
以tf.layers.batch_normalization
为例介绍里面所包含的主要参数:
tf.layers.batch_normalization(inputs, decay=0.999, center=True, scale=True, is_training=True, epsilon=0.001)
一般使用只要定义以下的参数即可:
inputs: 输入张量[N, H, W, C]
decay: 滑动平均的衰减系数,一般取接近1的值,这样能在验证和测试集上获得较好结果
center: 中心偏移量,上述的 β ,为True,则自动添加,否则忽略
scale: 缩放系数,上述的 γ ,为True,则自动添加,否则忽略
epsilon: 为防止除0而加的一个很小的数
is_training: 是否是训练过程,为True则代表是训练过程,那么将根据decay用指数滑动平均求得moments,并累加保存到
moving_mean
和moving_variance
中。否则是测试过程,函数直接取这两个参数来用。如果是True,则需在训练的session中添加将BN参数更新操作加入训练的代码:
# execute update_ops to update batch_norm weights update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS) with tf.control_dependencies(update_ops): optimizer = tf.train.AdamOptimizer(decayed_learning_rate) train_op = optimizer.minimize(loss, global_step = global_step)
Note
需要看上述函数的详细参数,可在python终端通过以下命令获取:
import tensorflow as tf
help(tf.layers.batch_normalization) # help中添加函数名