I’m currently facing a problem trying to create my own loss function. After watching several tutorials, I thought I had done it the good way, the problem is that my loss does not decrease. It’s perfectly constant. I used Variables with requires_grad=True and only performed torch operations so I really do not understand. Does anyone have an idea?
You can find my code below:
def __init__(self): super(DistanceLoss, self).__init__() def forward(self, output, target): output = Variable(output, requires_grad=True).to('cuda') target = Variable(target, requires_grad=True).to('cuda') binarized_output = torch.argmin(output, 1).type(dtype) one_hot_output = torch.nn.functional.one_hot(binarized_output.to(torch.int64)).type(dtype)[0, :, :, :] for c in range(2): target_coordinates = ((target[:, :, c] == 1).nonzero(as_tuple=False)).type(dtype) output_coordinates = ((one_hot_output[:, :, c] == 1).nonzero(as_tuple=False)).type(dtype) dist_matrix = torch.cdist(output_coordinates, target_coordinates, p=2.0, compute_mode='use_mm_for_euclid_dist_if_necessary') loss = torch.sum(torch.amin(dist_matrix, 1)) return Variable(loss, requires_grad=True).to('cuda')
What I understand is that the different operations I perform from the predicted image to the computed loss do not preserve the grad_fn of the different tensors. Nevertheless, I must compute these operations in order to calculate tha loss. Is there a way I can do it?
Thank you very much!