.grad 上的 pytorch 导数 returns none
pytorch derivative returns none on .grad
i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x = tr.tensor(2*(math.cos(i1)*math.cos(i2) - math.sin(i1)*math.sin(i2)) + 3*math.cos(i1),requires_grad=True)
y = tr.tensor(2*(math.sin(i1)*math.cos(i2) + math.cos(i1)*math.sin(i2)) + 3*math.sin(i1),requires_grad=True)
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)
我正在尝试 运行 以下代码,但在 z.backward()
之后我遇到了问题。 i1.grad
和 i1.grad
return none。据我了解,这个问题的原因是在火炬中评估 backward()
的方式。所以必须使用类似于 i1.retain_grad()
的方法来避免这个问题,我尝试这样做但我仍然得到 none。 i1.retain_grad 和 i2.retain_grad()
放在 z.backward()
之前和 z.backward()
之后,我仍然得到 none 作为答案。到底发生了什么,我该如何解决? y.grad
和 x.grad
工作正常。
使用:
i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x = 2*(torch.cos(i1)*torch.cos(i2) - torch.sin(i1)*torch.sin(i2)) + 3*torch.cos(i1)
y = 2*(torch.sin(i1)*torch.cos(i2) + torch.cos(i1)*torch.sin(i2)) + 3*torch.sin(i1)
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)
这里,使用torch.sin
和torch.cos
确保输出是连接到计算图中的i1
和i2
的torch张量。此外,像您一样使用 torch.tensor
创建 x
和 y
会将它们从现有图形中分离出来,这再次防止梯度流回 i1
和 i2
.
i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x = tr.tensor(2*(math.cos(i1)*math.cos(i2) - math.sin(i1)*math.sin(i2)) + 3*math.cos(i1),requires_grad=True)
y = tr.tensor(2*(math.sin(i1)*math.cos(i2) + math.cos(i1)*math.sin(i2)) + 3*math.sin(i1),requires_grad=True)
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)
我正在尝试 运行 以下代码,但在 z.backward()
之后我遇到了问题。 i1.grad
和 i1.grad
return none。据我了解,这个问题的原因是在火炬中评估 backward()
的方式。所以必须使用类似于 i1.retain_grad()
的方法来避免这个问题,我尝试这样做但我仍然得到 none。 i1.retain_grad 和 i2.retain_grad()
放在 z.backward()
之前和 z.backward()
之后,我仍然得到 none 作为答案。到底发生了什么,我该如何解决? y.grad
和 x.grad
工作正常。
使用:
i1 = tr.tensor(0.0, requires_grad=True)
i2 = tr.tensor(0.0, requires_grad=True)
x = 2*(torch.cos(i1)*torch.cos(i2) - torch.sin(i1)*torch.sin(i2)) + 3*torch.cos(i1)
y = 2*(torch.sin(i1)*torch.cos(i2) + torch.cos(i1)*torch.sin(i2)) + 3*torch.sin(i1)
z = (x - (-2))**2 + (y - 3)**2
z.backward()
dz_t1 = i1.grad
dz_t2 = i2.grad
print(dz_t1)
print(dz_t2)
这里,使用torch.sin
和torch.cos
确保输出是连接到计算图中的i1
和i2
的torch张量。此外,像您一样使用 torch.tensor
创建 x
和 y
会将它们从现有图形中分离出来,这再次防止梯度流回 i1
和 i2
.