我的编程空间,编程开发者的网络收藏夹
学习永远不晚

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

BCELoss

在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵。

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

先用Sigmoid给这些值都搞到0~1之间:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

假设Target是:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

下面我们用BCELoss来验证一下Loss是不是0.7194!

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

emmm应该是我上面每次都保留4位小数,算到最后误差越来越大差了0.0001。不过也很厉害啦哈哈哈哈哈!

BCEWithLogitsLoss

BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步。我们直接用刚刚的input验证一下是不是0.7193:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

嘻嘻,我可真是太厉害啦!

补充:Pytorch中BCELoss,BCEWithLogitsLoss和CrossEntropyLoss的区别

BCEWithLogitsLoss = Sigmoid+BCELoss

当网络最后一层使用nn.Sigmoid时,就用BCELoss,当网络最后一层不使用nn.Sigmoid时,就用BCEWithLogitsLoss。

(BCELoss)BCEWithLogitsLoss

用于单标签二分类或者多标签二分类,输出和目标的维度是(batch,C),batch是样本数量,C是类别数量,对于每一个batch的C个值,对每个值求sigmoid到0-1之间,所以每个batch的C个值之间是没有关系的,相互独立的,所以之和不一定为1。

每个C值代表属于一类标签的概率。如果是单标签二分类,那输出和目标的维度是(batch,1)即可。

CrossEntropyLoss用于多类别分类

输出和目标的维度是(batch,C),batch是样本数量,C是类别数量,每一个C之间是互斥的,相互关联的,对于每一个batch的C个值,一起求每个C的softmax,所以每个batch的所有C个值之和是1,哪个值大,代表其属于哪一类。如果用于二分类,那输出和目标的维度是(batch,2)。

补充:Pytorch踩坑记之交叉熵(nn.CrossEntropy,nn.NLLLoss,nn.BCELoss的区别和使用)

在Pytorch中的交叉熵函数的血泪史要从nn.CrossEntropyLoss()这个损失函数开始讲起。

从表面意义上看,这个函数好像是普通的交叉熵函数,但是如果你看过一些Pytorch的资料,会告诉你这个函数其实是softmax()和交叉熵的结合体。

然而如果去官方看这个函数的定义你会发现是这样子的:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

哇,竟然是nn.LogSoftmax()和nn.NLLLoss()的结合体,这俩都是什么玩意儿啊。再看看你会发现甚至还有一个损失叫nn.Softmax()以及一个叫nn.nn.BCELoss()。我们来探究下这几个损失到底有何种关系。

nn.Softmax和nn.LogSoftmax

首先nn.Softmax()官网的定义是这样的:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

嗯...就是我们认识的那个softmax。那nn.LogSoftmax()的定义也很直观了:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

果不其然就是Softmax取了个log。可以写个代码测试一下:

import torchimport torch.nn as nn a = torch.Tensor([1,2,3])#定义Softmaxsoftmax = nn.Softmax()sm_a = softmax=nn.Softmax()print(sm)#输出:tensor([0.0900, 0.2447, 0.6652]) #定义LogSoftmaxlogsoftmax = nn.LogSoftmax()lsm_a = logsoftmax(a)print(lsm_a)#输出tensor([-2.4076, -1.4076, -0.4076]),其中ln(0.0900)=-2.4076

nn.NLLLoss

上面说过nn.CrossEntropy()是nn.LogSoftmax()和nn.NLLLoss的结合,nn.NLLLoss官网给的定义是这样的:

The negative log likelihood loss. It is useful to train a classification problem with C classes

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

负对数似然损失 ,看起来好像有点晦涩难懂,写个代码测试一下:

import torchimport torch.nn a = torch.Tensor([[1,2,3]])nll = nn.NLLLoss()target1 = torch.Tensor([0]).long()target2 = torch.Tensor([1]).long()target3 = torch.Tensor([2]).long() #测试n1 = nll(a,target1)#输出:tensor(-1.)n2 = nll(a,target2)#输出:tensor(-2.)n3 = nll(a,target3)#输出:tensor(-3.)

看起来nn.NLLLoss做的事情是取出a中对应target位置的值并取负号,比如target1=0,就取a中index=0位置上的值再取负号为-1,那这样做有什么意义呢,要结合nn.CrossEntropy往下看。

nn.CrossEntropy

看下官网给的nn.CrossEntropy()的表达式:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

看起来应该是softmax之后取了个对数,写个简单代码测试一下:

import torchimport torch.nn as nn a = torch.Tensor([[1,2,3]])target = torch.Tensor([2]).long()logsoftmax = nn.LogSoftmax()ce = nn.CrossEntropyLoss()nll = nn.NLLLoss() #测试CrossEntropyLosscel = ce(a,target)print(cel)#输出:tensor(0.4076) #测试LogSoftmax+NLLLosslsm_a = logsoftmax(a)nll_lsm_a = nll(lsm_a,target)#输出tensor(0.4076)

看来直接用nn.CrossEntropy和nn.LogSoftmax+nn.NLLLoss是一样的结果。为什么这样呢,回想下交叉熵的表达式:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

其中y是label,x是prediction的结果,所以其实交叉熵损失就是负的target对应位置的输出结果x再取-log。这个计算过程刚好就是先LogSoftmax()再NLLLoss()。

------------------------------------

所以我认为nn.CrossEntropyLoss其实应该叫做softmaxloss更为合理一些,这样就不会误解了。

nn.BCELoss

你以为这就完了吗,其实并没有。还有一类损失叫做BCELoss,写全了的话就是Binary Cross Entropy Loss,就是交叉熵应用于二分类时候的特殊形式,一般都和sigmoid一起用,表达式就是二分类交叉熵:

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

直觉上和多酚类交叉熵的区别在于,不仅考虑了BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用的样本,也考虑了BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用的样本的损失。

pytorch的优点

1.PyTorch是相当简洁且高效快速的框架;2.设计追求最少的封装;3.设计符合人类思维,它让用户尽可能地专注于实现自己的想法;4.与google的Tensorflow类似,FAIR的支持足以确保PyTorch获得持续的开发更新;5.PyTorch作者亲自维护的论坛 供用户交流和求教问题6.入门简单

看完上述内容,你们掌握BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用

BCELoss和BCEWithLogitsLoss怎么在Pytorch中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。BCELoss在图片多标签分类时,如果3张图片分3类,
2023-06-15

怎么在pytorch中使用float64训练

怎么在pytorch中使用float64训练?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。原因在于:使用float16训练模型,模型效果会有损失,而使用double(float
2023-06-15

Optimizer与optimizer.step()怎么在pytorch中使用

今天就跟大家聊聊有关Optimizer与optimizer.step()怎么在pytorch中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。当我们想指定每一层的学习率时:opti
2023-06-15

Pytorch中的model.train()和model.eval()怎么使用

本文小编为大家详细介绍“Pytorch中的model.train()和model.eval()怎么使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Pytorch中的model.train()和model.eval()怎么使用”文章能帮助
2023-07-06

PyTorch中的train()、eval()和no_grad()怎么使用

本篇内容介绍了“PyTorch中的train()、eval()和no_grad()怎么使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么
2023-07-05

Python中Pytorch怎么使用

这篇文章将为大家详细讲解有关Python中Pytorch怎么使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。一、TensorTensor(张量是一个统称,其中包括很多类型):0阶张量:标量、常数、0-D
2023-06-15

parameter与buffer怎么在Pytorch模型中使用

本篇文章给大家分享的是有关parameter与buffer怎么在Pytorch模型中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。第一种参数有两种方式我们可以直接将模型的成
2023-06-15

PyTorch中torch.utils.data.DataLoader怎么使用

这篇文章主要介绍“PyTorch中torch.utils.data.DataLoader怎么使用”,在日常操作中,相信很多人在PyTorch中torch.utils.data.DataLoader怎么使用问题上存在疑惑,小编查阅了各式资料,
2023-07-02

pytorch中nn.Dropout怎么使用

小编给大家分享一下pytorch中nn.Dropout怎么使用,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!看代码吧~Class USeDropout(nn.Module): def __init__(self):
2023-06-15

pytorch中[..., 0]怎么使用

这篇文章将为大家详细讲解有关pytorch中[..., 0]怎么使用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在看程序的时候看到了x[…, 0]的语句不是很理解,后来自己做实验略微了解,以此记录方便自
2023-06-15

__init__、forward、__call__三者怎么在pytorch中使用

本篇文章给大家分享的是有关__init__、forward、__call__三者怎么在pytorch中使用,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1)__init__主要
2023-06-06

pytorch中nn.RNN()怎么使用

这篇文章主要介绍“pytorch中nn.RNN()怎么使用”,在日常操作中,相信很多人在pytorch中nn.RNN()怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”pytorch中nn.RNN()怎
2023-07-04

Pytorch中怎么使用TensorBoard

本文小编为大家详细介绍“Pytorch中怎么使用TensorBoard”,内容详细,步骤清晰,细节处理妥当,希望这篇“Pytorch中怎么使用TensorBoard”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一
2023-07-02

怎么在pytorch中使用MSELoss计算平均

本篇文章为大家展示了怎么在pytorch中使用MSELoss计算平均,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。给定损失函数的输入y,pred,shape均为bxc。若设定loss_fn = to
2023-06-15

怎么在Pytorch中切换 cpu和gpu

本篇文章给大家分享的是有关怎么在Pytorch中切换 cpu和gpu,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。方法1:x.to(device)把 device 作为一个可变
2023-06-06

Pytorch中net.train 和 net.eval怎么用

这篇文章主要介绍Pytorch中net.train 和 net.eval怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!在训练模型时会在前面加上:model.train()在测试模型时在前面使用:model.ev
2023-06-15

如何在pytorch中使用squeeze和cat函数

今天就跟大家聊聊有关如何在pytorch中使用squeeze和cat函数,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1 squeeze(): 去除size为1的维度,包括行和列。至
2023-06-15

Pytorch中torch.flatten()和torch.nn.Flatten()怎么用

本文小编为大家详细介绍“Pytorch中torch.flatten()和torch.nn.Flatten()怎么用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Pytorch中torch.flatten()和torch.nn.Flatte
2023-06-29

pytorch中with torch.no_grad()怎么使用

本篇内容主要讲解“pytorch中with torch.no_grad()怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“pytorch中with torch.no_grad()怎么使用”
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录