细数nn.BCELoss与nn.CrossEntropyLoss的区别


Posted in Python onFebruary 29, 2020

以前我浏览博客的时候记得别人说过,BCELoss与CrossEntropyLoss都是用于分类问题。可以知道,BCELoss是Binary CrossEntropyLoss的缩写,BCELoss CrossEntropyLoss的一个特例,只用于二分类问题,而CrossEntropyLoss可以用于二分类,也可以用于多分类。

不过我重新查阅了一下资料,发现同样是处理二分类问题,BCELoss与CrossEntropyLoss是不同的。下面我详细讲一下哪里不同。

1、使用nn.BCELoss需要在该层前面加上Sigmoid函数。

公式如下:

细数nn.BCELoss与nn.CrossEntropyLoss的区别

2、使用nn.CrossEntropyLoss会自动加上Sofrmax层。

公式如下:

细数nn.BCELoss与nn.CrossEntropyLoss的区别

可以看出,这两个计算损失的函数使用的激活函数不同,故而最后的计算公式不同。

补充拓展:pytorch的BCELoss和cross entropy

BCELoss:

torch.nn.BCELoss:

Input: (N, *)(N,∗) where *∗ means, any number of additional dimensions

Target: (N, *)(N,∗), same shape as the input

Output: scalar. If reduction is 'none', then (N, *)(N,∗), same shape as input.

这里的输入和target 目标必须形状一致,并且都是浮点数,二分类中一般用sigmoid的把输出挑出一个数:

>>> m = nn.Sigmoid()
>>> loss = nn.BCELoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(m(input), target)
>>> output.backward()

CrossEntropyLoss:

input(N,C) #n 是batch c是类别
target(N)

输入和target 形状是不同的crossEntropy 是自己会做softmax

>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()

以上这篇细数nn.BCELoss与nn.CrossEntropyLoss的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 正则表达式操作指南
May 04 Python
python多线程socket编程之多客户端接入
Sep 12 Python
python中实现k-means聚类算法详解
Nov 11 Python
python爬取亚马逊书籍信息代码分享
Dec 09 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
python 获取一个值在某个区间的指定倍数的值方法
Nov 12 Python
Python拆分大型CSV文件代码实例
Oct 07 Python
python 实现二维字典的键值合并等函数
Dec 06 Python
Python新手学习raise用法
Jun 03 Python
Python3.9 beta2版本发布了,看看这7个新的PEP都是什么
Jun 10 Python
Python爬虫实现HTTP网络请求多种实现方式
Jun 19 Python
Pytorch对Himmelblau函数的优化详解
Feb 29 #Python
Pytorch中的自动求梯度机制和Variable类实例
Feb 29 #Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 #Python
浅谈Pytorch中的自动求导函数backward()所需参数的含义
Feb 29 #Python
python数据预处理 :样本分布不均的解决(过采样和欠采样)
Feb 29 #Python
python实现门限回归方式
Feb 29 #Python
Python3.9又更新了:dict内置新功能
Feb 28 #Python
You might like
PHP批量生成缩略图的代码
2008/07/19 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
PHP中key和current,next的联合运用实例分析
2016/03/29 PHP
初识PHP中的Swoole
2016/04/05 PHP
PHP巧妙利用位运算实现网站权限管理的方法
2017/03/12 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
一个对于js this关键字的问题
2007/01/09 Javascript
javascript encodeURI和encodeURIComponent的比较
2010/04/03 Javascript
js判断输入是否为正整数、浮点数等数字的函数代码
2010/11/17 Javascript
javaScript复制功能调用实现方案
2012/12/13 Javascript
jquery struts 验证唯一标识(公用方法)
2013/03/27 Javascript
node.js中的buffer.toJSON方法使用说明
2014/12/14 Javascript
js实现分享到随页面滚动而滑动效果的方法
2015/04/10 Javascript
JQuery为元素添加样式的实现方法
2016/07/20 Javascript
浅谈js多维数组和hash数组定义和使用
2016/07/27 Javascript
简单的js表格操作
2016/09/24 Javascript
JS基于递归实现倒计时效果的方法
2016/11/26 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
vue-cli脚手架-bulid下的配置文件
2018/03/27 Javascript
nodejs基础之buffer缓冲区用法分析
2018/12/26 NodeJs
轻松解决JavaScript定时器越走越快的问题
2019/05/13 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
Vue中qs插件的使用详解
2020/02/07 Javascript
9个JavaScript日常开发小技巧
2020/10/06 Javascript
简介Python中用于处理字符串的center()方法
2015/05/18 Python
Python实现栈的方法
2015/05/26 Python
Tensorflow累加的实现案例
2020/02/05 Python
python实现微信打飞机游戏
2020/03/24 Python
完美解决pycharm 不显示代码提示问题
2020/06/02 Python
python Tornado框架的使用示例
2020/10/19 Python
关于PySnooper 永远不要使用print进行调试的问题
2021/03/04 Python
用css3实现转换过渡和动画效果
2020/03/13 HTML / CSS
烹饪自我鉴定
2014/03/01 职场文书
产品生产计划书
2014/05/07 职场文书
在校生证明
2015/06/17 职场文书