Ejemplo n.º 1
0
    def forward(self, pred, target):
        if pred.dim() > 2:
            pred = pred.view(pred.size(0), pred.size(1),
                             -1)  # N,C,H,W => N,C,H*W
            pred = pred.transpose(1, 2)  # N,C,H*W => N,H*W,C
            pred = pred.contiguous().view(-1,
                                          pred.size(2))  # N,H*W,C => N*H*W,C
        target = target.view(-1, 1)

        pred_softmax = F.softmax(pred)
        pred_softmax = pred_softmax.gather(1, target)
        pred_softmax = pred_softmax.view(-1)
        pt = Variable(pred_softmax.data)

        diff = (1 - pt)**self.gamma

        if self.alpha is not None:
            if self.alpha.type() != input.data.type():
                self.alpha = self.alpha.type_as(input.data)
            alpha_t = self.alpha.gather(0, target.data.view(-1))
            loss = -1 * alpha_t * diff * pt._log()
        else:
            loss = -1 * diff * pt.log_()

        if self.reduction == 'mean':
            return loss.mean()
        else:
            return loss.sum()