darknet的batch_norm是如何融合到卷积层conv的

前向传播中,batch_norm与conv的融合

1. batch_norm层的前向传播

其中mean(X)表示训练过程中得到的滑动平均值,var(X)表示训练过程中得到的滑动方差。具有泛化整个训练过程所有的图片的像素值。\gamma表示缩放因子,\beta表示为平移因子,为学习过程中学习到的值。

2. conv层的前向传播

其中W表示为卷积核,b表示为偏置,卷积层一般为0。

3. 合并batch_norm与conv

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值