时间:2021-05-22
以前我浏览博客的时候记得别人说过,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:
Input: (N, *)(N,∗) where *∗ means, any number of additional dimensionsTarget: (N, *)(N,∗), same shape as the inputOutput: 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的区别就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
路径:https://pytorch.org/docs/master/nn.init.html#nn-init-doc初始化函数:torch.nn.init#-
torch.nn是专门为神经网络设计的模块化接口,nn构建于autgrad之上,可以用来定义和运行神经网络nn.Module是nn中重要的类,包含网络各层的定义
我就废话不多说了,大家还是直接看代码吧~importtorch.nnasnnimporttorch.nn.functionalasFimporttorch.nn
pytorch中的权值初始化官方论坛对weight-initilzation的讨论torch.nn.Module.apply(fn)torch.nn.Modul
pytorch中view是tensor方法,然而在sequential中包装的是nn.module的子类,因此需要自己定义一个方法:importtorch.nn