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 9 and [Solved] What is the correct way to implement custom loss function? 28 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