gpt4 book ai didi

python - 在其他元素中受 nan 影响的张量元素上的 PyTorch 向后()

转载 作者:行者123 更新时间:2023-12-03 23:38:43 27 4
gpt4 key购买 nike

考虑以下两个示例:

x = torch.tensor(1., requires_grad=True)
y = torch.tensor(0., requires_grad=True)
z = torch.full((2, ), float("nan"))
z0 = x * y / y
z1 = x + y
print(z0, z1) # tensor(nan, grad_fn=<DivBackward0>) tensor(1., grad_fn=<AddBackward0>)
z1.backward()
print(x.grad) # tensor(1.)


x = torch.tensor(1., requires_grad=True)
y = torch.tensor(0., requires_grad=True)
z = torch.full((2, ), float("nan"))
z[0] = x * y / y
z[1] = x + y
print(z) # tensor([nan, 1.], grad_fn=<CopySlices>)
z[1].backward()
print(x.grad) # tensor(nan)
在示例 1 中, z0不影响 z1 ,以及 backward()z1按预期执行和 x.grad不是楠。但是,在示例 2 中, backward()z[1]似乎受 z[0]影响, 和 x.gradnan .
我如何防止这种情况(示例 1 是所需的行为)?具体我需要保留 nanz[0]所以将 epsilon 添加到除法没有帮助。

最佳答案

indexing分配中的张量,PyTorch 访问张量的所有元素(它在引擎盖下使用二进制乘法掩码来保持可微性),这就是它获取 nan 的地方另一个元素的(因为 0*nan -> nan )。
我们可以在计算图中看到这一点:

torchviz.make_dot(z1, params={'x':x,'y':y})torchviz.make_dot(z[1], params={'x':x,'y':y})

enter image description here
enter image description here


如果您希望避免这种行为,请使用 mask the nan 's ,或者像你在第一个例子中所做的那样 - 将它们分成两个不同的对象。

关于python - 在其他元素中受 nan 影响的张量元素上的 PyTorch 向后(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67447166/

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