pytorch是权重更新循环中的_叶属性
我试图通过一个简单的感知器使用一段“解构”的代码来理解pytorch是权重更新循环中的_叶属性,pytorch,perceptron,autograd,Pytorch,Perceptron,Autograd,我试图通过一个简单的感知器使用一段“解构”的代码来理解autograd的基本概念 import numpy as np from Sigmoid import * import torch #inputs X = np.array([[0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]]) #targets D = np.array([[0], [0]
autograd
的基本概念
import numpy as np
from Sigmoid import *
import torch
#inputs
X = np.array([[0, 0, 1],
[0, 1, 1],
[1, 0, 1],
[1, 1, 1]])
#targets
D = np.array([[0],
[0],
[1],
[1]])
# Convert numpy arrays to torch tensors
X = torch.from_numpy(X).float()
D = torch.from_numpy(D).float()
W = torch.rand((1,3), requires_grad=True)
x = X[0,:].T
d = D[0]
v = torch.matmul(W, x)
y = Sigmoid(v)
e = d - y
e2 = torch.square(e)
L = torch.sum(e2)
L.backward(retain_graph=True)
print(W.is_leaf) # gives True
dW = W.grad
W = W-0.9*dW
print(W.is_leaf) # now gives False
...
变量W.is_leaf=True
在W=W-0.9*dW
之前和False
之后。这是一个问题,因为如果要循环输入,会出现以下错误:
正在访问不是叶张量的张量的.grad属性。在autograd.backward()期间不会填充其.grad属性。如果确实需要非叶张量的渐变,请在非叶张量上使用.retain_grad()。如果您错误地访问了非叶张量,请确保您访问的是叶张量
查看,我理解了原因:操作W=W-0.9*dW
重新创建W
导致W.is\u leaf=False
我不清楚的是如何解决这个问题。在看了几篇文章之后,我尝试了一些方法,比如W.retain\u grad()
或L.backward(retain\u graph=True)
,但它们似乎不起作用
我确信我遗漏了一些非常基本的东西,我想知道是否有人能给我指出正确的方向
提前谢谢