半年前写的博客,今天发现没有发出去,还好本地有md的文档,决定重新发一下
毕竟网上来回抄袭的blog太多了,代码质量也莫得保证
今天需要用pytorch融合下bn层,写个脚本稍后再传到csdn上
原理
BN层的融合即为将caffe中BN层与Scale层融合进Convolution的权重之中,把三层减少为一层,适用于训练完成的模型部署阶段,而不能用在训练中。
融合BN与卷积要求BN层位于卷积之后,且融合后的卷积层参数convolution_param中的bias_term必须为true。
假设每一层的输入均表示为XXX,则卷积层可以写作
WX+b WX+b WX+b
BN层执行了两个操作,一个是归一化,另一个是缩放,两个阶段的操作分别为:
X−meanvar \frac {X-mean} {\sqrt{var}} varX−mean
γ∗X+β \gamma*X+\beta γ∗X+β
将上面三个式子合并,即可得到:
γ∗(Wold∗X+bold)−meanvar+β \gamma*\frac{(W_{old}*X+b_{old})-mean}{\sqrt{var}} + \beta γ∗var(