Pytorch Pyrotch-未计算参数的梯度

Pytorch Pyrotch-未计算参数的梯度,pytorch,Pytorch,打印出来 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,) fo

打印出来

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)

如何学习a和c的梯度?变量d需要保持参数

基本上,当您创建一个新的张量时,如
torch.nn.parameter()
torch.tensor()
,您创建的是一个叶节点张量

当您执行类似于
c=a+1
的操作时,
c
将成为中间节点。您可以
打印(c.is_leaf)
以检查张量是否为叶节点。默认情况下,Pytorch不会计算中间节点的渐变

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

如果你把代码改成这个

a=torch.nn.Parameter(torch.randn(1,需要_grad=True,dtype=torch.float,device=device))
b=torch.nn.参数(torch.randn(1,需要_grad=True,dtype=torch.float,device=device))
c=a+1
d=c
对于范围内的历元(n_历元):
yhat=d+b*x\u列张量
错误=y列张量-yhat
损失=(错误**2).平均值()
loss.backward()
打印(a.grad)#不是没有
打印(b.grad)#不是无
打印(c.grad)#无
打印(d.grad)#无

你会发现
a
b
有梯度,但是
c.grad
d.grad
没有梯度,因为它们是中间节点

这里,c是正则张量,而不是参数,所以PyTorch不计算它们的梯度。本教程()可能会对您有所帮助。@WasiAhmad关于a呢?有没有办法让d保留为参数,但作为中间节点?@algogator我认为旧版本的pytorch可以将中间节点的.requiure_grad设置为true,但最新版本似乎不允许这样做。
None
tensor([-0.8707])
None
tensor([-1.1125])