caffe && pytorch BN

BN在caffe中的实现

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维
这里写图片描述

猜你喜欢

转载自blog.csdn.net/u013548568/article/details/80928742
BN
今日推荐