前向传播中,batch_norm与conv的融合
1. batch_norm层的前向传播
其中mean(X)表示训练过程中得到的滑动平均值,var(X)表示训练过程中得到的滑动方差。具有泛化整个训练过程所有的图片的像素值。表示缩放因子,
表示为平移因子,为学习过程中学习到的值。
2. conv层的前向传播
其中W表示为卷积核,b表示为偏置,卷积层一般为0。
3. 合并batch_norm与conv![](https://i-blog.csdnimg.cn/blog_migrate/110f7150919f78cfa7399b83dbdbbf30.png)
4. darknet中的函数fuse_conv_batchnorm
5. matlab版本的fuse_conv_batchnorm
% 融合batch_norm、激活函数到conv中
function obj=fuse_conv_batchnorm(conv,bn,activate_fun)
obj = conv;
obj.activate_fun = activate_fun; % 激活函数
eps = 1e-5;
if ~isempty(bn)
% conv层的weights融合,矩阵运算
bn_w = bn.gamma./sqrt(bn.rolling_var + eps);
% 第一种方法。conv.kernels size:[3,3,3,n], bn_w size:[1,1,n]。
% reshape后:conv_kernels size:[27,n], bn_w size: [1,n]
tmp = reshape(conv.kernels,[],conv.filters).*reshape(bn_w,[],conv.filters);
obj.kernels = reshape(tmp,size(conv.kernels)); % 相乘之后reshape为[3,3,3,n]
% 第二种方法
% for k = 1:conv.filters
% obj.kernels(:,:,:,k) = conv.kernels(:,:,:,k)*bn_w(:,:,k);
% end
% conv层bias融合
obj.bias = bn.beta - bn.rolling_mean.*bn.gamma./sqrt(bn.rolling_var + eps);
end
end