🎃融合BN和Conv层
层融合可以减少启动kernel的开销与memory操作,从而提高效率 同时,有些计算可以通过层融合优化后,跟其他计算合并
Vertical layer fusion(垂直层融合):用的比较常见,针对conv + BN + ReLU进行融合

Horizontal layer fusion(水平层融合)

回顾一下Batch Normalization的公式,其中

μBσB2=B1i=1∑Bxi=B1i=1∑B(xiμB)2+ϵxiyi=σB2+ϵxi−μB=γ∗xi+β展开yi=γ∗σB2+ϵxi−μB+βxi=w∗x+b代入y=γ∗σB2+ϵw∗x+b−μB+β
y=γ∗σB2+ϵw∗x+b−μB+βy=σB2+ϵγ∗w∗x+σB2+ϵγ(b−μB)+βy=(σB2+ϵγ∗w)∗x+(σB2+ϵγ(b−μB)+β)
w=σB2+ϵγ∗wb=σB2+ϵγ(b−μB)+β
这两个参数值可以提前计算出来.
很多模型经常会有很多 种类的activation function,比如 GELU, Swish, Mish等等,这些激活函数往往由于计算复杂很难加速,可以尝试改成ReLU看看精度的改变和性能的提升.
把上面的公式写成矩阵的形式:
对于一个形状为C×H×W的特征图F,记归一化结果F^,计算如下:
F^1,i,jF^2,i,j⋮F^C−1,i,jF^C,i,j=σ12+ϵγ10⋮00σ22+ϵγ2⋯⋯⋱σC−12+ϵγC−100⋮0σC2+ϵγC⋅F1,i,jF2,i,j⋮FC−1,i,jFC,i,j+β1−γ1σ12+ϵμ^1β2−γ2σ22+ϵμ^2⋮βC−1−γC−1σC2+ϵμ^C2+ϵ
代码如下:
Last updated