PyTorch 中 BatchNorm1d 的输出与手动归一化输入维度的输出不匹配
Output of BatchNorm1d in PyTorch does not match output of manually normalizing input dimensions
为了理解 BatchNorm1d
在 PyTorch 中的工作原理,我尝试将 BatchNorm1d
操作在二维张量上的输出与手动归一化相匹配。手动输出似乎缩小了 0.9747 倍。这是代码(注意仿射设置为假):
import torch
import torch.nn as nn
from torch.autograd import Variable
X = torch.randn(20,100) * 5 + 10
X = Variable(X)
B = nn.BatchNorm1d(100, affine=False)
y = B(X)
mu = torch.mean(X[:,1])
var_ = torch.var(X[:,1])
sigma = torch.sqrt(var_ + 1e-5)
x = (X[:,1] - mu)/sigma
#the ration below should be equal to one
print(x.data / y[:,1].data )
输出为:
0.9747
0.9747
0.9747
....
对 BatchNorm2d
做同样的事情没有任何问题。 BatchNorm1d
如何计算其输出?
找到原因了。 torch.var
在计算方差时使用贝塞尔校正。传递属性 unbiased=False
给出相同的值。
为了理解 BatchNorm1d
在 PyTorch 中的工作原理,我尝试将 BatchNorm1d
操作在二维张量上的输出与手动归一化相匹配。手动输出似乎缩小了 0.9747 倍。这是代码(注意仿射设置为假):
import torch
import torch.nn as nn
from torch.autograd import Variable
X = torch.randn(20,100) * 5 + 10
X = Variable(X)
B = nn.BatchNorm1d(100, affine=False)
y = B(X)
mu = torch.mean(X[:,1])
var_ = torch.var(X[:,1])
sigma = torch.sqrt(var_ + 1e-5)
x = (X[:,1] - mu)/sigma
#the ration below should be equal to one
print(x.data / y[:,1].data )
输出为:
0.9747
0.9747
0.9747
....
对 BatchNorm2d
做同样的事情没有任何问题。 BatchNorm1d
如何计算其输出?
找到原因了。 torch.var
在计算方差时使用贝塞尔校正。传递属性 unbiased=False
给出相同的值。