对训练测试推理BN层的理解(总结)

参考:1、BN层中为什么测试时使用训练的到的全局均值以及标准差?

2、模型推理加速技巧:融合BN和Conv层 - 知乎
一、训练

        训练的时候BN层是以每个channel来计算均值和方差,比如是如的是64*32*32*3,3代表channel,当前假如是rgb,64是batchsize。首先在r,g,b上分别求出当前图像所有像素点的均值和方差,然后在batch上求平均,得到该组batch数据的局部数据均值和方差。然后引入bn层中的权重α和偏执β。可学习参数α、β是一个1*channel维度的。之后保存的α、β应该是求所有训练样本和batch的全局参数。

二、测试
        测试的时候如果依旧按照bn的公式算当前batch的均值和方差,如果测试图片batch一般为1,那么就大大降低模型的泛化能力,这和训练是要求batch尽可能大的初衷是不一致的。这里借用一句话:某一个样本经过测试时应该有确定的输出,如果在测试时也是用测试数据的means和var,那么样本的输出会随所处batch的不同,而有所差异。即batch的随机性导致了样本测试的不确定性。所以使用固定的在训练中得出的mean和var。因此,单个样本的输出不应取决于批量归⼀化所需要的随机小批量中的均值和⽅差 。这句话其实就是说为了增加模型的鲁棒性,在测试的时候使用的均值和方差为训练数据通过 指数滑动平均(ExponentialMovingAverage)EMA估算整个训练数据集的样本均值和方差的全局值,并不是当前测试batch的局部值。

三、推理

        推理的最大目标之一就是减少模型运行速度。通过参考2的理解可以将bn层可以看作是1*1的卷积,其中和α是卷积的权重 β是偏执。并且可以和和前一个连着的卷积层融合成新的卷积,即:(conv+bn-->conv),然后进行推理,由于少了计算量,因此可以起到加速的作用。具体操作请参考2。

你可能感兴趣的:(模型部署,pytorch,tensorflow,深度学习,cnn)