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)
,但它们似乎不起作用

我确信我遗漏了一些非常基本的东西,我想知道是否有人能给我指出正确的方向

提前谢谢