[Batch Normalization] Predict中BN是怎么计算的?

在Predict中,如果输入的是一张图片,按照Batch Norm的过程,E(x)=x, Var(x)=0,此时,怎么计算?
 
Update:搜索之后,发现,似乎是模型应该是计算/存储每个batch的Mean的mean和Var的mean,在predict/test的时候是在存储的mean和var作为每次bn的mean和var?有没有人能解释或者确认一下这个步骤?不想扒代码……
已邀请:

星空下的巫师 - https://github.com/shicai/Caffe_Manual

赞同来自: caffe ruirui_ICT shuimulinxi shuokay

在训练的时候用移动平均(类似于momentum)的方式更新batch mean和variance,训练完毕,得到一个相对比较稳定的mean和variance,存在模型中。
测试的时候,就直接用模型中的均值和方差进行计算。

ruirui_ICT - 听大大们说,要“左手代码,右手公式”,喵~

赞同来自: shuokay xjtuljy caffe

最近正好也在看BN,还没看的特别懂,和大家讨论一下吧~
首先题主在问题中“似乎是模型应该是计算/存储每个batch的Mean的mean和Var的mean”这么拗口的话都能写出来,我觉得其实你是理解的(偷笑)
我是这样理解的:
在BN的论文里,3.1节“Training and Inference with Batch-Normalized Networks”中写到,训练结束后,对整个训练集计算了所有mini-batch的mean和var的平均的无偏估计,作为最终的mean和var存储到了模型中。测试的时候直接从模型中读取mean和var进行计算。也可以从Algorithm2中看出来,第10行就是在计算无偏估计,第11行里计算时已经变成利用无偏估计的值计算了。
1.JPG

后来我看了看caffe里的实现,batch_norm_layer.cpp的代码,然而并没有看懂TAT。只发现了一个比较重要的参数use_global_stats_。在LayerSetup函数里,当phase==Test时use_global_stats_=1。在Forward函数里又发现了
if (use_global_stats_) {
// use the stored mean/variance estimates.
const Dtype scale_factor = this->blobs_[2]->cpu_data()[0] == 0 ?
0 : 1 / this->blobs_[2]->cpu_data()[0];
caffe_cpu_scale(variance_.count(), scale_factor,
this->blobs_[0]->cpu_data(), mean_.mutable_cpu_data());
caffe_cpu_scale(variance_.count(), scale_factor,
this->blobs_[1]->cpu_data(), variance_.mutable_cpu_data());
} else {
就是利用存储在模型中的mean和var进行计算。
但现在的问题是,其他部分的代码我看的有点晕,于是计算无偏估计和更新mean和var是在哪一部分代码里实现的呢?希望有知道的同学给我讲讲TAT。。
 
(针对最近大大们头疼的侵权问题,在这里弱弱的加一句:本内容为本人原创,仅授权给CaffeCN社区(caffecn.cn)使用,如需转载须注明转载来源。(⊙v⊙))

shuokay

赞同来自: lkafs

情报更新:
请教了大神,caffe使用bn的时候,计算最后的mean和var的无偏估计是用的moving average技术,技术详细参考https://en.wikipedia.org/wiki/Moving_average
代码还没扒明白。希望看明白的小伙伴能讲一下。

lkafs - SYSUer

赞同来自: yuanyinlove

caffe 中的batch norm层如果不手动设置 use_global_stats_的话,默认训练时该参数为 false,也就是楼上说的利用moving average 的技术来不断更新 global的mean和var。默认测试时该参数为true,也就是不再计算每个测试batch的mean 和var 直接使用存储的 training set的mean 和 var。可以参考看一下文章作者的回答(第二个答者):https://www.quora.com/How-does ... ation
 

tianxingyzxq

赞同来自:

caffe中的bn层中的把3个学习率都设置lr=0是不是也不更新均值和方差了?

要回复问题请先登录注册