def focal_loss_alt(self, x, y, iw_local): '''Focal loss alternative. Args: x: (tensor) sized [N,D]. y: (tensor) sized [N,]. Return: (tensor) focal loss. ''' alpha = 0.25 #n=iw.size()[0] t = one_hot_embedding(y.data.cpu(), 1 + self.num_classes) t = t[:, 1:] t = Variable(t).cuda() xt = x * (2 * t - 1) # xt = x if t > 0 else -x pt = (2 * xt + 1).sigmoid() pt = pt.clamp(min=1e-15) w = alpha * t + (1 - alpha) * (1 - t) loss = -w * pt.log() / 2 w_loss = iw_local.unsqueeze(1) * loss ''' m=loss.size()[0] i=0 w_loss=0 while i<n: w_loss+=iw[i]*loss[i*m/n:(i+1)*m/n].sum() i+=1 ''' return w_loss.sum()
def focal_loss(self, x, y): '''Focal loss. Args: x: (tensor) sized [N,D]. y: (tensor) sized [N,]. Return: (tensor) focal loss. ''' alpha = 0.25 gamma = 2 t = one_hot_embedding(y.data.cpu(), 1+self.num_classes) # [N,21] t = t[:,1:] # exclude background t = Variable(t).cuda() # [N,20] p = x.sigmoid() pt = p*t + (1-p)*(1-t) # pt = p if t > 0 else 1-p w = alpha*t + (1-alpha)*(1-t) # w = alpha if t > 0 else 1-alpha w = w * (1-pt).pow(gamma) return F.binary_cross_entropy_with_logits(x, t, w, size_average=False)