running_mean和running_var

最近在看yolov4的pytorch源码,下面的这段代码,有些疑问,涉及到了running_mean和running_var

def load_conv_bn(buf, start, conv_model, bn_model):
    num_w = conv_model.weight.numel()
    num_b = bn_model.bias.numel()
    bn_model.bias.data.copy_(torch.from_numpy(buf[start:start + num_b]));
    start = start + num_b
    bn_model.weight.data.copy_(torch.from_numpy(buf[start:start + num_b]));
    start = start + num_b
    bn_model.running_mean.copy_(torch.from_numpy(buf[start:start + num_b]));
    start = start + num_b
    bn_model.running_var.copy_(torch.from_numpy(buf[start:start + num_b]));
    start = start + num_b
    conv_model.weight.data.copy_(torch.from_numpy(buf[start:start + num_w]).reshape(conv_model.weight.data.shape));
    start = start + num_w
    return start
  • pytorch在打印网络参数的时候,只打出weight和bias这两个参数。但是,BN层应该是有四个参数,因为pytorch中只有可学习的参数才称为parameter,而running_mean和running_var则是在前向时先由X计算出mean和var,再由mean和var以动量momentum来更新running_mean和running_var。
  • BN层中还会保存更新动量momentum和防止数值计算错误的eps
  • 在训练阶段,running_mean和running_var在每次前向时更新一次;在测试阶段,则通过net.eval()固定该BN层的running_mean和running_var,此时这两个值即为训练阶段最后一次前向时确定的值,并在整个测试阶段保持不变。
def batch_norm(self, x):
    """
    :param x: 数据
    :return: BN输出
    """
    x_mean = x.mean(axis=0)
    x_var = x.var(axis=0)
    # 对应running_mean的更新公式
    # running_mean = (1 - momentum) * mean_old + momentum * mean_new
	# running_var = (1 - momentum) * var_old + momentum * var_new
    self._running_mean = (1-self._momentum)*self._running_mean + self._momentum*x_mean
    self._running_var = (1-self._momentum)*self._running_var + self._momentum*x_var
    # 对应论文中计算BN的公式
    x_hat = (x-x_mean)/np.sqrt(x_var+self._eps)
    y = self._gamma*x_hat + self._beta
    return y

之前在Batch Normalization有一些关于BN的理解,可以结合看。

  • 16
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值