Gradients of neural network for 3 Dim input - 1 Dim output regression

I want to get the gradients of model(neural network).
In tensorflow, there is a ‘tf.gradient’
so the following way is possible.

x = tf.placeholder(shape=[None,1],dtype=tf.float32)
y = tf.placeholder(shape=[None,1],dtype=tf.float32)
inp = tf.concat([x,y],axis=-1)

def network(x):
	x = tf.layers.dense(x,128,activation=tf.nn.relu)
	x = tf.layers.dense(x,128,activation=tf.nn.relu)
	x = tf.layers.dense(x,128,activation=tf.nn.relu)
	x = tf.layers.dense(x,128,activation=tf.nn.relu)
	x = tf.layers.dense(x,128,activation=tf.nn.relu)
	x = tf.layers.dense(x,1)
	return x

pred = network(inp)
dfdx,dfdy = tf.gradients(pred,[x,y])

But how to I get similar results with above code using pytorch?

class net(torch.nn.Module):
  def __init__(self):
    super(net,self).__init__()
    self.linear={}
    self.wei={}
    self.bias={}
    self.para=[]
    self.linear[0] = torch.nn.Linear(3,128)
    self.linear[1] = torch.nn.Linear(128,128)
    self.linear[2] = torch.nn.Linear(128,128)
    self.linear[3] = torch.nn.Linear(128,128)
    self.linear[4] = torch.nn.Linear(128,1)
  def forward(self,x):
    for i in range(4):
      x=F.elu(self.linear[i](x))
    x=self.linear[4](x)
    return x

M=net()

for i in range(5):
  M.para+=list(M.linear[i].parameters())


L=nn.MSELoss()
opt=torch.optim.Adam(M.para,0.00035)

######################################

X=torch.Tensor(data[:,0:3])   ### 3 dim input
X.requires_grad_(True)
Y=torch.Tensor(data[:,3])
Y=Y.reshape(-1,1)

for epoch in range(10000):
    opt.zero_grad()
    idx=torch.randint(0,X.shape[0],(24,))
    M_dev=torch.autograd.grad(M.forward(X),X,torch.ones_like(M.forward(X)))   ????

I tried ‘torch.autograd.grad(M.forward(X),X,torch.ones_like(M.forward(X)))’
but it gives wrong answer…

How I can get like ‘tf.gradient( M.forward(X), X)’ ???