gpt4 book ai didi

pytorch - 没有为参数计算梯度

转载 作者:行者123 更新时间:2023-12-05 01:36:13 67 4
gpt4 key购买 nike

a = torch.nn.Parameter(torch.randn(1, requires_grad=True, dtype=torch.float, device=device))
b = torch.nn.Parameter(torch.randn(1, requires_grad=True, dtype=torch.float, device=device))
c = a + 1
d = torch.nn.Parameter(c, requires_grad=True,)
for epoch in range(n_epochs):
yhat = d + b * x_train_tensor
error = y_train_tensor - yhat
loss = (error ** 2).mean()
loss.backward()
print(a.grad)
print(b.grad)
print(c.grad)
print(d.grad)

打印出来
None
tensor([-0.8707])
None
tensor([-1.1125])

我如何学习 a 和 c 的梯度?变量 d 需要留一个参数

最佳答案

基本上,当你创建一个新的张量时,比如 torch.nn.Parameter()torch.tensor() ,您正在创建一个 叶节点张量。

当你做类似 c=a+1 的事情时, c将是 中间节点 .您可以 print(c.is_leaf)检查张量是否为叶节点。 Pytorch 默认不会计算中间节点的梯度。

在您的代码片段中,a , b , d都是叶节点张量,和c是中间节点。 c.gradNone因为 pytorch 不计算中间节点的梯度。 a当您调用 loss.backword() 时,它与图形隔离.这就是为什么a.grad也是None .

如果你把代码改成这样

a = torch.nn.Parameter(torch.randn(1, requires_grad=True, dtype=torch.float, device=device))
b = torch.nn.Parameter(torch.randn(1, requires_grad=True, dtype=torch.float, device=device))
c = a + 1
d = c
for epoch in range(n_epochs):
yhat = d + b * x_train_tensor
error = y_train_tensor - yhat
loss = (error ** 2).mean()
loss.backward()
print(a.grad) # Not None
print(b.grad) # Not None
print(c.grad) # None
print(d.grad) # None

你会发现 ab有渐变,但 c.gradd.grad是无,因为它们是中间节点。

关于pytorch - 没有为参数计算梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58421637/

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