def forward(cls, ctx, input, target): """ input (FloatTensor): n x num_classes target (LongTensor): n, the indices of the target classes """ assert_equal(input.shape[0], target.shape[0]) p_star = sparsemax(input, 1) cls.p_star = p_star.clone().detach() loss = _omega_sparsemax(p_star) p_star.scatter_add_(1, target.unsqueeze(1), torch.full_like(p_star, -1)) loss += torch.einsum("ij,ij->i", p_star, input) ctx.save_for_backward(p_star) return loss
def forward(ctx, input, target, k=100): """ input (FloatTensor): n x num_classes target (LongTensor): n, the indices of the target classes """ assert_equal(input.shape[0], target.shape[0]) p_star = tsallis15_topk(input, 1, k) loss = _omega_tsallis15(p_star) p_star.scatter_add_(1, target.unsqueeze(1), torch.full_like(p_star, -1)) loss += torch.einsum("ij,ij->i", p_star, input) ctx.save_for_backward(p_star) # loss = torch.clamp(loss, min=0.0) # needed? return loss
def forward(ctx, input, target, n_iter=50): """ input (FloatTensor): n x num_classes target (LongTensor): n, the indices of the target classes """ assert_equal(input.shape[0], target.shape[0]) p_star = sparsemax_bisect(input, n_iter) # this is onw done directly in sparsemax_bisect # p_star /= p_star.sum(dim=1).unsqueeze(dim=1) loss = _omega_sparsemax(p_star) p_star.scatter_add_(1, target.unsqueeze(1), torch.full_like(p_star, -1)) loss += torch.einsum("ij,ij->i", p_star, input) ctx.save_for_backward(p_star) # loss = torch.clamp(loss, min=0.0) # needed? return loss