Large-Margin Softmax Loss

L-Softmax Loss是一种增强深度学习模型类内紧凑性和类间间隔的方法,通过引入更大的分类间隔来提高分类准确性。它修改了原始Softmax Loss,确保在二分类问题中,正确类别的特征与决策边界的夹角大于其他类。L-Softmax Loss的几何解释显示了其增加的分类边界,从而改善特征分布的紧凑性和类别间隔。实验表明,随着m值的增加,不同类别的特征角间隔增大,类内特征更加紧凑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Large-Margin Softmax Loss

前言

前言
Large-Margin Softmax Loss也是为了提高类内特征的紧凑性,拉大类间特征的间隔(intra-class compactness and inter-class separability)而提出来的。

Large-Margin Softmax Loss1

该论文提出了一个增大类间特征间隔的softmax loss。

定义深度网络模型提取出来的特征为 x i \mathbf{x}_i xi,softmax损失函数为
L = 1 N ∑ i L i = 1 N ∑ i − log ⁡ ( e w y i T x i ∑ j e w j T x i ) L = \frac{1}{N} \sum_{i} L_i = \frac{1}{N} \sum_i - \log \left (\frac{e^{\mathbf{w}_{y_i}^T \mathbf{x}_i}}{\sum_{j} e^{\mathbf{w}_{j}^T \mathbf{x}_i}} \right) L=N1iLi=N1ilog(jewjTxiewyiTxi)
这里忽略偏置b。样本i的类别j的分数由 w j T x i \mathbf{w}_j^T \mathbf{x}_i wjTxi决定,这是一个内乘操作,所以可以说类别j的分数由向量 w j \mathbf{w_j} wj x i \mathbf{x}_i xi的相似度决定,二者的相似度越大,分数越高,样本i越有可能属于类别j。内乘操作可以写成向量模和夹角余弦的乘积形式,如下:
w j T x i = ∥ w j ∥ ∥ x i ∥ cos ⁡ ( θ j ) \mathbf{w}_j^T \mathbf{x}_i = \lVert \mathbf{w}_j \rVert \lVert \mathbf{x}_i \rVert \cos(\theta_j) wjTxi=wjxicos(θj)

Lovasz-Softmax Loss是一种用于处理多类别分割任务的损失函数,尤其适用于那些类别不平衡的数据集。它结合了传统softmax交叉熵和Jaccard相似度的思想。以下是使用PyTorch实现 Lovasz-Softmax Loss的基本代码: ```python import torch from scipy.special import softmax def lovasz_grad(gt_sorted): """ Computes gradient of the Lovasz extension w.r.t sorted errors See Alg. 1 in paper """ p = len(gt_sorted) gts = gt_sorted.sum() intersection = gts - gt_sorted.float().cumsum(0) union = gts + (1 - gt_sorted).float().cumsum(0) jaccard = 1. - intersection / union if p > 1: # cover 1-pixel case jaccard[1:] = jaccard[1:] - jaccard[:-1] return jaccard def lovasz_softmax_flat(probas, labels, classes='present', per_image=False, ignore=None): """ Multi-class Lovasz-Softmax loss probas: [B, C, H, W] Variable, class probabilities at each prediction (between 0 and 1). labels: [B, H, W] Tensor, ground truth labels (between 0 and C - 1) classes: 'all' for all, 'present' for classes present in labels, or a list of classes to average. per_image: compute the loss per image instead of per batch ignore: void class id """ if per_image: loss = mean(lovasz_softmax_flat(probas[i], labels[i], classes, ignore=ignore) for i in range(labels.size(0))) else: losses = [] C = probas.size(1) if ignore is not None: valid = (labels != ignore) else: valid = labels >= 0 for c in range(C): fg = (labels == c) & valid if classes == 'present': fg_sum = fg.sum(dim=(1, 2)) if fg_sum.item() > 0: if classes == 'all': if ignore is not None: valid_c = (labels != (c + ignore)) & valid fg = fg & valid_c else: fg = fg[labels == c] elif c not in classes: continue if fg.any(): if permute: fg = fg[:, :, None].expand_as(probas) fg = fg.contiguous().view(-1) probas_c = probas[:, c].contiguous().view(-1) else: fg = fg.view(-1) probas_c = probas[fg, c] lab_c = labels.new_full((probas_c.numel(),), c, dtype=torch.long) lab_c = lab_c[fg] loss = lovasz_loss(probas_c, lab_c, reduce=False) losses.append(loss.view(-1, 1)) loss = sum(losses) return loss # 使用示例 probas = torch.rand(5, 10, 28, 28) labels = torch.randint(0, 9, (5, 28, 28)) loss = lovasz_softmax_flat(probas, labels) ``` 注意,这个实现需要`scipy`库来进行softmax操作,以及一些额外的计算。如果你的环境中没有安装`scipy`,可以尝试其他开源库如`pylops`提供类似的功能。同时,`permute`变量在这里被假设为True,表示是否需要对输入概率分布进行维度转换。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值