Hi, I want to change part of intermediate layer’s activation to zero during forward pass,
suppose my forward function is like this:
def forward(self, x):
    x = self.l1(x)
    x = F.relu(x)
    x[:10,:] = 0

    def x_hook(grad):
        grad_clone = grad.clone()
        grad_clone[:10,:]= 0
        return grad_clone
    x.register_hook(x_hook)
    
    output = F.log_softmax(x,dim=1)
    return output

this runs well inside train function, however inside my test function
def test(model, device, test_loader):
    model.eval()
    ...
    with torch.no_grad():
        for data, target in test_loader:
            ...
            output = model(data)
            ...

However, while running the code inside test model, it gives out an error
cannot register a hook on a tensor that doesn’t require gradient
My question is：
(1)Can we put register_hook of torch.tensor inside forward function?
(2)Why register_hook function called inside torch.no_grad() still calculate gradients here?
Any suggestion would be appreciated!