Hi, I am trying to apply boosting with NN, and to do so I need to multiply the loss of each sample by a scalar weight.
I’m implementing it by slightly changing the BCELoss in the following way:
from torch.nn.modules.loss import BCELoss
from torch.nn import functional as F
from torch.nn.modules.loss import BCELoss import torch from torch.nn import functional as F class WeightedBCELoss(BCELoss): def __init__(self, weight=None, size_average=None, reduce=None, reduction='mean', weights_boosting=None): super(BCELoss, self).__init__(weight, size_average, reduce, reduction) self.weights_boosting = weights_boosting def forward(self, input, target): total_cross_entropy = 0 for i, sample in enumerate(input): y_hat = input[i] y = target[i] c_e = F.binary_cross_entropy(y_hat, y, weight=self.weight, reduction=self.reduction).item() c_e = c_e * self.weights_boosting[i].item() total_cross_entropy = total_cross_entropy + c_e return torch.tensor([total_cross_entropy], requires_grad=True)
But afterwards my model weights do not change at all. Do you have any idea on how to fix it?
N.B. If I try to remove that “requires_grad=True” at the last line, it goes:
RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
Thanks in advance