batch normalization 中的 moving_mean与moving_variance理解

batch normalization在训练部分代码时看到下面这一行

update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
  with tf.control_dependencies(update_ops):
    train_op = optimizer.minimize(loss, global_step)
************************************************************
这里先介绍tf.control_dependencies的作用
在有些机器学习程序中我们想要指定某些操作执行的依赖关系,这时我们可以使用tf.control_dependencies()来实现。 

control_dependencies(control_inputs)返回一个控制依赖的上下文管理器,使用with关键字可以让在这个上下文环境中的操作都在control_inputs 执行。

with g.control_dependencies([a, b, c]):
  # `d` and `e` will only run after `a`, `b`, and `c` have executed.
  d = ...

这里给出两个对这一函数的理解

https://blog.csdn.net/pku_jade/article/details/73498753

https://blog.csdn.net/u012436149/article/details/72084744

*************************************************************

回到正文

我定义网络结构中用的是tf.layers.batch_normalization,查看它的api,发现一个注释:note: when training, the moving_mean andmoving_variance need to be updated. By default the update ops are placed in tf.GraphKeys.UPDATE_OPS, so they need to be added as a dependency to the train_op

 这里就需要进一步思考为什么会这样,先说一下batch normalization原论文中对moving average的说明:在原论文中,训练过程中均值和方差所求的是每一个mini batch的均值方差,而在测试过程中,并不是求整个测试样本的均值方差,而是在之前训练的过程中求所有batch的均值的期望,方差的期望。然后进行测试推理,详细解释如下:

但是在实际tensorflow的应用中并没有采取以上方式,而是使用另一种方式,默认为:

当前mean = 0.1 * 当前mean + 0.9 * 上一次训练的mean

var同理,两个值在训练迭代过程中相当于是在不断的moving。完全是经验主义,没什么道理可讲,所以batch normalization本身是个次优的

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值