caffe BN
BN层主要有均值, 方差, γ γ , β β 四个参数,其中 γ γ , β β 是要学习的参数一个代表的是缩放系数,也就是将分布变胖或者变瘦,一个是偏移系数,将分布左右移动。进行BN操作的主要目的是,将数据的分布归一化到非线性函数敏感的区域也即线性区,避免进入饱和区,因为一旦进入饱和区,就会造成梯度消失, γ γ , β β 适当的将分布进行了变胖变瘦或者移动的这样的一个操作。
其中BN的均值,方差,beta,gamma都是变量。use_global_status只是控制
β
β
和
γ
γ
是不是固定,如果要控制beta,gamma固定的话,在caffe里面是控制scale层的值不更新,在pytorch里面直接设置
β
β
和
γ
γ
的requires_grad=False
即可
1、use_global_status=False
训练的时候,设置use_global_status=False表示一个batch的计算的方差和均值都是来自于这个batch的数据的统计
2、use_global_status=True
测试的时候,设置use_global_status=True,表示一个batch的计算的方差和均值都是来自于整个数据集的统计,已经保存好了
caffe的bn层只是对输入做了一个归一化,没有用 γ,β γ , β 进行相关的操作,所以caffe的bn要与scale层结合,用scale层来实现 β,γ β , γ 的功能
pytorch BN
通过model.train()和model.eval()来决定bn层的均值方差来源
1、model.train()
均值方差统计来自于当前batch
2、model.eval()
均值和方差来自于整体数据
BN 2d
spatial bn的计算是在NxCxWXH的基础上运算的,那么是在channel的维度上进行bn操作,也即NxWxH为一组计算一个均值和方差,然后NxWxH对这一组的元素分别减去这个均值和方差,因为有C个通道,所以就会有C个均值和C个方差。假设某一层的参数通道数是C,那么所有的mean,var,weight,bias都是C维的,如图,lin_.1层有256个通道,因此所有的参数都是256维