我是靠谱客的博主 忧伤爆米花,这篇文章主要介绍python batchnorm2d_pytorch nn.BatchNorm1d 与手动python实现不一样--解决办法,现在分享给大家,希望可以做个参考。

由于实验需要,便用pytorch函数手动实现了batchnorm函数,但是最后发现结果不对,最后在Pytorch论坛上找到了相关解决办法!

基础

前期实现

上述博客给出了python实现代码,我将其中的numpy函数改成了pytorch的相关函数:

def fowardbn(x, gam, beta, ):

'''

x:(N,D)维数据

'''

momentum = 0.1

eps = 1e-05

running_mean = 0

running_var = 1

running_mean = (1 - momentum) * running_mean + momentum * x.mean(dim=0)

running_var = (1 - momentum) * running_var + momentum * x.var(dim=0)

mean = x.mean(dim=0)

var = x.var(dim=0)

# bnmiddle_buffer = (input - mean) / ((var + eps) ** 0.5).data

x_hat = (x - mean) / torch.sqrt(var + eps)

out = gam * x_hat + beta

cache = (x, gam, beta, x_hat, mean, var, eps)

return out, cache

然后与nn.BatchNorm1d计算的结果比较:

model2 = nn.BatchNorm1d(5)

input1 = torch.randn(3, 5, requires_grad=True)

input2 = input1.clone().detach().requires_grad_()

x = model2(input1)

out, cache = fowardbn(input2, model2.weight, model2.bias) # 使用相同的尺度变换量

发现结果x和out的值不一样。

然后就不停的找问题是不是实现方法有差别。

在官方论坛上找到了,有人遇到了相同的问题,官方人员给了答复,还提供了一个官方的实现版本。

Pytorch的论坛做的还是挺不错的。

问题

我发现官方实现的代码中

var = input.var([0, 2, 3], unbiased=False)

在求输入的方差时,多了一个参数设置unbiased=False,不懂。

我又查看了一下Pytorch的代码文档:

torch.var(input, unbiased=True) → Tensor

Returns the variance of all elements in the input tensor.

If unbiased is False, then the variance will be calculated via the biased estimator. Otherwise, Bessel’s correction will be used.

意思是unbiased = False时,通过无偏估计计算,反之则通过贝塞尔矫正方法计算。可用如下图片总结:

image.png

这是统计方面的知识了,可以参考此博客。

最终实现代码

将初始代码中方差计算加上参数unbiased = False,结果正确,完整代码如下

def fowardbn(x, gam, beta, ):

momentum = 0.1

eps = 1e-05

running_mean = 0

running_var = 1

running_mean = (1 - momentum) * running_mean + momentum * x.mean(dim=0)

running_var = (1 - momentum) * running_var + momentum * x.var(dim=0)

mean = x.mean(dim=0)

var = x.var(dim=0,unbiased=False)

# bnmiddle_buffer = (input - mean) / ((var + eps) ** 0.5).data

x_hat = (x - mean) / torch.sqrt(var + eps)

out = gam * x_hat + beta

cache = (x, gam, beta, x_hat, mean, var, eps)

return out, cache

model2 = nn.BatchNorm1d(5)

input1 = torch.randn(3, 5, requires_grad=True)

input2 = input1.clone().detach().requires_grad_()

x = model2(input1)

out, cache = fowardbn(input2, model2.weight, model2.bias)

Reference

最后

以上就是忧伤爆米花最近收集整理的关于python batchnorm2d_pytorch nn.BatchNorm1d 与手动python实现不一样--解决办法的全部内容,更多相关python内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(45)

评论列表共有 0 条评论

立即
投稿
返回
顶部