首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >五分钟理解:BCELoss 和 BCEWithLogitsLoss的区别

五分钟理解:BCELoss 和 BCEWithLogitsLoss的区别

作者头像
机器学习炼丹术
发布2020-07-14 11:04:20
发布2020-07-14 11:04:20
14.2K00
代码可运行
举报
运行总次数:0
代码可运行

整体来说,这个区别,有没有with logit就是看模型的最后一层有没有加上sigmoid层。

BCEwithlogitsloss = BCELoss + Sigmoid

1 举个例子

导入必要库,设置预测数值和模型真实类别(二分类问题)

代码语言:javascript
代码运行次数:0
运行
复制
import torch
pred = torch.tensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])

2 BCELoss

先把pred转换成Sigmoid的0~1的概率。

代码语言:javascript
代码运行次数:0
运行
复制
sigmoid = torch.nn.Sigmoid()
print(sigmoid(pred))

然后计算BCELoss:

上面的pred(i)表示第i个样本的经过sigmoid的预测概率。

  • 第一个样本的loss:
  • 第二个样本的loss:
  • 第三个样本的loss:

求相反数的均值:

然后用PyTorch的BCELoss来计算一下:

代码语言:javascript
代码运行次数:0
运行
复制
import torch
pred = torch.tensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])
sigmoid = torch.nn.Sigmoid()
loss = torch.nn.BCELoss()
print('BCELoss:',loss(sigmoid(pred),target))

得到答案:

3 BCEWithLogitsLoss

直接来看这个结果就行了:

代码语言:javascript
代码运行次数:0
运行
复制
import torch
pred = torch.FloatTensor([[-0.2],[0.2],[0.8]])
target = torch.FloatTensor([[0],[0],[1]])
sigmoid = torch.nn.Sigmoid()
loss = torch.nn.BCEWithLogitsLoss()
print('BCEWithLogitsLoss:',loss(pred,target))

一样,所以就相差一个Sigmoid罢了。


喜欢的话请关注我们的微信公众号~【机器学习炼丹术】。

  • 公众号主要讲统计学,数据科学,机器学习,深度学习,以及一些参加Kaggle竞赛的经验。
  • 公众号内容建议作为课后的一些相关知识的补充,饭后甜点。

微信搜索公众号:【机器学习炼丹术】。期待您的关注。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习炼丹术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 举个例子
  • 2 BCELoss
  • 3 BCEWithLogitsLoss
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档