Hey !
Here’s a description of my problem:
I want to create a Custom Loss to be able to take into account only some predictions in the loss calculation. But I have a problem with the backward function which doesn’t work and prints:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
Here is the code:
def my_custom_loss(output, target):
# Transform tensor to np.array
sub_labels = np.array([item for sublist in target.tolist() for item in sublist])
sub_outputs = np.array([item for sublist in output.tolist() for item in sublist])
# Get index of list of labels with '-1'
ind = [index for index,value in enumerate(sub_labels) if value != -1]
# Remove elements with '-1'
sub_labels = torch.tensor(sub_labels[ind], dtype=torch.float64)
sub_outputs = torch.tensor(sub_outputs[ind], dtype=torch.float64)
# Compute the loss
the_loss = F.binary_cross_entropy_with_logits(sub_outputs, sub_labels)
return the_loss
Do you know what is the problem with my custom loss ?
Here’s what I have already tried:
- I tried to remove transformations made to tensor (ie: Create the same function which only return the loss of output and target. This makes the “loss.backward()” work but it’s not the custom function I want to code.
- I tried to to add “the_loss.requires_grad = True” in “my_custom_loss” before the return, it makes the “loss.backward()” work but my model doesn’t learn at all (loss doesn’t change with epoch).
I wish I was clear, if you want more details you can ask me
Thank you and have a nice day !