pytorch中的loss函数(1):MultiLabelSoftMarginLoss

1、MultiLabelSoftMarginLoss原理

MultiLabelSoftMarginLoss针对multi-label one-versus-all(多分类,且每个样本只能属于一个类)的情形。

loss的计算公式如下:

loss(x,y)=-\tfrac{1}{C}*\sum_{i}^{ }y[i]*log((1+exp(-x[i]))^{-1})+(1-y[i])*log(\tfrac{exp(-x[i])}{1+exp(-x[i])})

其中,x是模型预测的标签,x的shape是(N,C),N表示batch size,C是分类数;y是真实标签,shape也是(N,C),y[i]\in\{0,1\}

exp(-x[i])的值域是(0,\infty);

1+exp(-x[i])的值域是(1,\infty);

(1+exp(-x[i]))^{-1}的值域是(0,1);

log((1+exp(-x[i]))^{-1})的值域是(-\infty,0),函数曲线如图1所示:

图1
图1

为了看得更清楚一点,再画一下[-10,10]范围内的曲线,如图2:

图2

当y[i]=1得时候,x[i]越大==》{\color{Red} }log((1+exp(-x[i]))^{-1}){\color{Red} }越大==》loss越小(因为\tfrac{1}{C}前面有个负号);

log(\tfrac{exp(-x[i])}{1+exp(-x[i])})的函数曲线如图3所示:

 [-10,10]范围内的曲线,如图4所示:

 当y[i]=0得时候,x[i]越小==》log(\tfrac{exp(-x[i])}{1+exp(-x[i])})越大==》loss越小(因为\tfrac{1}{C}前面有个负号);

 

2、使用MultiLabelSoftMarginLoss进行图片多分类

2.1 数据源以及如何打标签

以mnist数据源为例,共有10个分类。mnist中每张图片的标签是0-9中的一个数字,我们需要对标签进行转换:对于标签是0的图片,转换成的新标签是[1,0,0,0,0,0,0,0,0,0];对于标签是1的图片,转换成的新标签是[0,1,0,0,0,0,0,0,0,0];依此类推。

2.2 模型训练

2.2.1 模型搭建

MultiLabelSoftMarginLoss层前一层输出的特征图的大小必须是1*10,我们可以使用一个out_features是10的Linear层(全连接层)来实现。

 

  • 9
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值