批次归一化对每个神经元都进行了归一化,或者说对每个特征都进行了归一化,并且用可学习的参数和进行重构。
那么如果卷积神经网络有3个通道,长和宽都是244,BN将需要学习3*244*244*2个参数,计算量是不是太大了?
实际上BN在CNN中只学习了3*2个参数,这里也有一个参数共享,它把一个特征图作为一个神经元,也就是说,对于同一个特征图,不同的像素点,采用的均值和方差是一样的。
那么具体计算均值和方差的时候应该怎么做呢?BN相当于把一个特征图的每个像素点都看成是这个特征的样本,因此,假设一个mini batch的数据是8*3*224*224,那么对于其中一个通道(特征图)的不同样本,就是8*244*244个像素,直接flatten,然后再计算mean和var即可,对每个特征图,都这样计算一次。
以上是个人的理解,网上查不到太多关于BN是“如何把一个特征图作为一个特征”的资料,并且pytorch的源码追不到这里面的细节,唯一的参考链接如下,也在github上进行了一点查证。如果有不对的地方,欢迎大佬指正,感激不尽。
参考的链接:
https://www.cnblogs.com/king-lps/p/8378561.html