Hello,
I have written the following loss function but it is failing with “‘float’ object has no attribute ‘backward’” during training. I looked into earlier post https://pytorch.org/docs/master/notes/extending.html and [Solved] What is the correct way to implement custom loss function? but could not find out what is the issue in my loss function. Can anyone please help on this? Thanks
class IntersectionOverUnion(nn.Module):
""" Implementation of the Soft-Dice Loss function. Arguments: num_classes (int): number of classes. eps (float): value of the floating point epsilon. """ def __init__(self, num_classes, eps=1e-5): super().__init__() # init class fields self.num_classes = num_classes self.eps = eps # define the forward pass def forward(self, preds, targets): # pylint: disable=unused-argument """ Compute Soft-Dice Loss. Arguments: preds (torch.FloatTensor): tensor of predicted labels. The shape of the tensor is (B, num_classes, H, W). targets (torch.LongTensor): tensor of ground-truth labels. The shape of the tensor is (B, 1, H, W). Returns: mean_loss (float32): mean loss by class value. """ loss = 0 # iterate over all classes for cls in range(self.num_classes): # get ground truth for the current class target = (targets == cls).float() # get prediction for the current class pred = preds[:, cls] # calculate intersection intersection = (pred * target).sum() # compute dice coefficient # iou = (2 * intersection + self.eps) / (pred.sum() + target.sum() + self.eps) iou = (intersection + self.eps) / (intersection + 1) # compute negative logarithm from the obtained dice coefficient loss = loss - iou.log() # get mean loss by class value loss = loss / self.num_classes # print("Value:", loss.item()) # loss_k = torch.tensor(loss.item(), dtype= torch.double) loss_k = loss.item() return loss_k