Is this operation diffferentiable?

I am getting “there are no graph nodes that require computing gradients”. Is it because this operation is not differentiable?

def distance(input, means):
     df = 1
     dist = torch.zeros(self.means.size(0), input.size(0))
     for i in range(self.means.size()[0]):
          dist[i] = torch.pow(1 + torch.sum(torch.pow(input - self.means[i], 2), 1) / df, -(1 + df)/2).data
     return dist.t()

If not, can you please show me what is thecorrect way to make this operation differentiable?

How did you get “there are no graph nodes that require computing gradients”?

But anyways, I tweaked the code a little and you can call backwards on it:

import torch
from torch.autograd import Variable

def distance(input, means):
     df = 1
     dist = Variable(torch.zeros(means.size(0), input.size(0)))
     for i in range(means.size()[0]):
          dist[i] = torch.pow(1 + torch.sum(torch.pow(input - means[i], 2), 1) / df, -(1 + df)/2)
     return dist.t()

x = Variable(torch.randn(2, 2), requires_grad=True)
means = Variable(torch.randn(2), requires_grad=False)
out = distance(input, means).sum()
out.backward()
x.grad  # prints something

You have to wrap your tensors in Variables so that autograd can keep track of them to compute backwards.

2 Likes

That worked, Thank you !!!