Hi; I’m working on gradient estimator; so I need to implement model that requires manually compute and apply gradients
here is my current script
from itertools import chain
net1 = Net1() # neural network
net2 = Net2() # neural network

opt = Adam(list(net1.parameters()) + list(net2.parameters()), lr=1e-3)

params = chain(net1.parameters(), net2.parameters())

for _ in range(epoches):
    opt.zero_grad()  # at second iterations, line raises error
    grad = torch.autograd.grad(loss, params)

    for i,p in enumerate(params):
        p.grad = grad[I]
   
    opt.step()
    

At second iterations,
opt.zero_grad()
leads to
/anaconda3/lib/python3.7/site-packages/torch/optim/optimizer.py in zero_grad(self)
    161             for p in group['params']:
    162                 if p.grad is not None:
--> 163                     p.grad.detach_()
    164                     p.grad.zero_()
    165 

RuntimeError: Can't detach views in-place. Use detach() instead
I couldn’t know where does my code go wrong here. Any help ?
Here is a short script of simple model
class Net(nn.Module):

    def __init__(self):
        super(Net, self).__init__()
        self.fc1 = nn.Linear(1,4)
        self.fc2 = nn.Linear(4,1)
    def forward(self,x):
        h = self.fc1(x)
        h = self.fc2(nn.ReLU()(h))
        return h


# create data
x = torch.torch.randn(20,1)
y = 1.2 * x ** 2 - 1
loss_fn = lambda y_hat,y: (y_hat - y).pow(2).sum()


net = Net()
optimizer = optim.SGD(net.parameters(), lr=1e-3)

Loss = []
for _ in range(1000):
    optimizer.zero_grad()
    y_hat = net(x)
    loss = loss_fn(y_hat,y)
    grad = torch.autograd.grad(loss, net.parameters())
    for i,p in enumerate(net.parameters()):
        p.grad = grad[i]
        print(p.grad)
    optimizer.step()
    Loss.append(loss.item())

Thanks in advance