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])