细数nn.BCELoss与nn.CrossEntropyLoss的区别
以前我浏览博客的时候记得别人说过,BCELoss与CrossEntropyLoss都是用于分类问题。可以知道,BCELoss是Binary CrossEntropyLoss的缩写,BCELoss CrossEntropyLoss的一个特例,只用于二分类问题,而CrossEntropyLoss可以用于二分类,也可以用于多分类。
不过我重新查阅了一下资料,发现同样是处理二分类问题,BCELoss与CrossEntropyLoss是不同的。下面我详细讲一下哪里不同。
1、使用nn.BCELoss需要在该层前面加上Sigmoid函数。
公式如下:
2、使用nn.CrossEntropyLoss会自动加上Sofrmax层。
公式如下:
可以看出,这两个计算损失的函数使用的激活函数不同,故而最后的计算公式不同。
补充拓展:pytorch的BCELoss和cross entropy
BCELoss:
torch.nn.BCELoss:
1 2 3 4 5 | 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的把输出挑出一个数:
1 2 3 4 5 6 | >>> 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:
输入和target 形状是不同的crossEntropy 是自己会做softmax
1 2 3 4 5 | >>> 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的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

微信公众号搜索 “ 脚本之家 ” ,选择关注
程序猿的那些事、送书等活动等着你
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 reterry123@163.com 进行投诉反馈,一经查实,立即处理!
相关文章
Django报错TemplateDoesNotExist的问题及解决
这篇文章主要介绍了Django报错TemplateDoesNotExist的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教2023-08-08
最新评论