gpt4 book ai didi

python - nn.Linear 的输出对于相同的输入是不同的

转载 作者:行者123 更新时间:2023-12-04 14:48:41 30 4
gpt4 key购买 nike

torch==1.7.1+cu101 中,我有两个张量

import torch
a = torch.rand(1,5,10)
b = torch.rand(100,1,10)

和一个前馈网络

import torch.nn as nn
l = nn.Linear(10,10)

我强制其中一行相等:

a[0,0] = b[80][0].clone()

然后我将两个张量都提供给 l:

r1 = l(a)
r2 = l(b)

显然,由于 a[0,0] 等于 b[80,0]r1[0,0] < strong>必须等于 r2[80,0]。但事实证明是这样的:

(r1[0,0] == r2[80,0]).all()
>>> False

我已经通过以下方式修复了随机性:

seed = 42

random.seed(seed)
os.environ['PYTHONHASHSEED'] = str(seed)
np.random.seed(seed)
torch.manual_seed(seed)
torch.cuda.manual_seed(seed)
torch.cuda.manual_seed_all(seed)
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = True

有谁知道为什么 (r1[0,0] == r2[80,0]).all() 是 False?

最佳答案

如果您要打印 r1[0, 0]r2[80, 0],您会发现它们非常相似。甚至在打印位数上完全相同。

但是,如果您打印 r1[0, 0] - r2[80, 0],您会发现生成的条目并不完全是 0.0(尽管它们接近它),这意味着 r1[0, 0]r2[80, 0] 接近但不完全相同。

现在,如果我们要先取出这些单独的向量,然后像这样将它们传递给线性层:

r1_small = l(a[0, 0])
r2_small = l(b[80, 0])
print((r1_small == r2_small).all()) # tensor(True)

我们知道它们完全相同,即使是 float 也是如此。

因此,这意味着相同的向量在通过线性层时是较大张量的较小部分会引入一些差异。

同样值得注意的是,当前 n-1 个维度都是 2 的幂时,不会出现相同的差异:

a2 = torch.randn(8, 8, 10)
b2 = torch.randn(4, 16, 10)
a2[0, 0] = b2[1, 0].clone()
r1_2 = l(a2)
r2_2 = l(b2)
print((r1_2[0, 0] == r2_2[1, 0]).all()) # tensor(True)

所以,虽然我不知道细节,但我怀疑它与 byte alignment 有关.

一般来说,测试在数学上应该相等的浮点值之间的完全相等并不总能给出预期的结果。那么我们如何处理这些差异呢?您可以使用 torch.isclosetorch.allclose检查不完全相等。

关于python - nn.Linear 的输出对于相同的输入是不同的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69459859/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com