so here I have a very simple model

```
def Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.conv1 = nn.Conv2d(...)
self.conv2 = nn.Conv2d(...)
...
self.output =nn.Conv2d(...)
#some more code for relu and BN
def forward(self, x):
out = self.conv1(x)
#some more code for relu and BN
out = self.conv2(out)
#some more code for relu and BN
...
out = self.output(out)
return out
```

I know that I can pass in some random data like:

```
model = Net()
fake_input = torch.randn((1,1,32,32),requires_grad=True)
output = model(fake_input)
```

and if i want to see the gradient of the input i can use:

```
shape = torch.ones_like(output)
output.backward(shape)
#and the gradient for input data will be
print(fake_input.grad.data)
```

so here I want to know, is it possible that we can fix the gradient of ouput layer to be some matrix M, and we back-propagate from that layer, then we study the gradient response of the input?

something like this:

```
#change the gradient of output layer to matrix_M
net.output.weight.grad = matrix_M
#do back-propagation, here the network gradient should already be changed to matrix_M
out.backward(shape)
#and study the gradient response of input
print(fake_input.grad.data)
```

I am not sure if I did this in correct way…can anyone give me some hints?