我试图从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
最重要的是,当使用浮点数时,不要为获得精确的结果而担心。由于你使用的是数字计算机,在一定程度上,你必须在准确性上做出妥协。
有一些库没有这些问题,它们是纯粹的软件。因此,它们会慢得多。