常规的神经网络连接结构如下

当网络训练完成, 在推导的时候为了加速运算, 通常将卷积层和 batch-norm 层融合, 原理如下
[egin{align*}
y_{conv} &= w cdot x + b \
y_{bn} &= gamma cdot left (frac{y_{conv} - E[x]}{sqrt{Var[x] + epsilon}}
ight)+eta \
&= gamma cdot left (frac{wx+b - E[x]}{sqrt{ Var[x] + epsilon}}
ight)+eta \
hat w &= frac{gamma}{sqrt{Var[x] + epsilon}}cdot w \
hat b &= frac{gamma}{sqrt{Var[x] + epsilon}}cdot left({b - E[x]}
ight)+eta \
y_{bn} &= hat w cdot x + hat b \
end{align*}
]
推导时, E[x] 为 runnin_mean(滑动均值), Var[x] 为 running_var(滑动方差),
pytorch 的 running_var 存储的是方差, 而不是标准差
caffe 中的 conv-bn-scale-relu 结构

caffe模型的转化可以参考pvanet的卷积层和 batch-norm融合代码