归一化后均值不为0(火炬视觉)



我试图从Trochvision.transforms中理解Normalize()。使用后,mean应为0,std()应为1。至少教程是这么说的。但这行不通!

我试过这个代码:

tensor = torch.Tensor([[[1, 2, 3], [4, 5, 6]], [[1, 2, 3], [4, 5, 6]]])
normalize = transforms.Normalize(3.5, 1.7838) # used tensor.mean(), tensor.std()
norm_tensor = normalize(tensor)

输出为

  • norm_tensor.mean():tensor(-4.9671e-09)
  • norm_tensor.std():tensor(1.0000)

平均值不应该恰好是0而不是-4.9671e-09吗?我试着在谷歌上搜索,发现了一些教程,比如这个。奇怪的是,他们得到了3.4769e-08但是要写"是的!!!!"我们的张量归一化为0 mean[…]">

是我错过了一些理解,还是"接近0"?而不是0正确的规范化?

我认为这是由于浮点减法[*]。

考虑以下内容:

1 - 1/3 - 2/3

输出:

>>> 1 - 1/3 - 2/3
1.1102230246251565e-16

这是因为浮点减法不准确。所谓不准确,我的意思是它失去了重要数字。当你把两个"相近"的数相减时,通常不会得到精确的0。

由于归一化需要减法(通过平均值),因此您不会得到完全为零,因为每个元素都与理想值有一些误差,如果它减去确切的理想平均值。

计算的平均值本身也不完全是理想的,实际的平均值,尽管这不太可能是误差的主要原因。


问题是,为什么你需要它恰好为零?


  • 假设这就是原因,但不可否认我没有看过实际的代码。

您将注意到1 - 1/2 - 1/4 - 1/4 == 0,因为数字的表示方式,尽管稍加努力,我们可以"打破";

例子
>>> 1e50 - 2e49 - 4e49 -4e49
1.0384593717069655e+34
>>> 1e20 - 2e19 - 4e19 -4e19
0.0

最重要的是,当使用浮点数时,不要为获得精确的结果而担心。由于你使用的是数字计算机,在一定程度上,你必须在准确性上做出妥协。

有一些库没有这些问题,它们是纯粹的软件。因此,它们会慢得多。

相关内容

  • 没有找到相关文章

最新更新