Crossentropyloss与 BCELoss差异

文章详细解释了在PyTorch中,Crossentropyloss用于多分类任务,其输入是经过softmax的预测概率和long类型的标签,而BCELoss(包括BCEWithLogitsLoss)适用于二分类,需要对预测值先应用sigmoid并使用float类型的标签。同时,文中给出了手动实现这两种损失函数的代码示例。
摘要由CSDN通过智能技术生成

Crossentropyloss与 BCELoss差异

在这里插入图片描述

python报错:

1only batches of spatial targets supported (non-empty 3D tensors) but got targets of size

因为在使用Crossentropyloss作为损失函数时,output=net(input)的output应该是[batchsize, channel, height, weight],而label则是[batchsize, height, weight],label是单通道灰度图.

而在BCELoss中,两者都是[batchsize, channel, height, weight]。

报错是因为label本应该是一维的,我在保存的时候处理成了3维。

BCELoss

在这里插入图片描述

主要用于计算标签只有1或者0时的二分类损失,标签和预测值是一一对应的。需要注意的是,通过nn.BCEloss来计算损失前,需要对预测值进行一次sigmoid计算。sigmoid函数会将预测值映射到0-1之间。
如果觉得手动加sigmoid函数麻烦,可以直接调用nn.BCEwithlogitsloss。

使用nn.BCEloss计算损失

import torch
import torch.nn as nn
import torch.nn.functional as F

loss = nn.BCELoss(reduction="none")
target = torch.tensor([1,0,1], dtype=torch.float32)
predict = torch.tensor([0.8, 0.2, 0.3], dtype=torch.float32)
loss(F.sigmoid(predict), target)

#结果计算为:
tensor([0.3711, 0.7981, 0.5544])

手动实现nn.BCEloss

def myBceloss(predict, target, reduction="none"):
    predict = F.sigmoid(predict)
    if reduction == "none":
        return -(target*torch.log(predict) + (1-target)*torch.log(1-predict))     
myBceloss(predict, target)

#结果计算为:
tensor([0.3711, 0.7981, 0.5544])

Crossentropyloss

在这里插入图片描述
用于计算多分类任务,一个标签可能对应了预测的多个概率,例如一个任务包含了C个类别,那么预测值就有C 个。

使用nn.CrossEntropyLoss计算损失

(已经使用了softmax)

loss2 = nn.CrossEntropyLoss(reduction="none")
target2 = torch.tensor([0, 1, 2])
predict2 = torch.tensor([[0.9, 0.2, 0.8], [0.5, 0.2, 0.4], [0.4, 0.2, 0.9]])
loss2(predict2, target2)

#结果计算为:
tensor([0.8761, 1.2729, 0.7434])

手动实现nn.CrossEntropyLoss

def myCrossEntropyloss(target, predict, reduction="none"):
    if reduction == "none":
        predict = F.softmax(predict, dim=1)
        n = torch.arange(predict.shape[0])
        predict = predict[n, target]
        return -torch.log(predict)
myCrossEntropyloss(target2, predict2)
#结果计算为:
tensor([0.8761, 1.2729, 0.7434])

注意

BCEWithLogitsLoss 要求它的目标是一个float 张量,而不是long。
Crossentropyloss 的标签要求是long类型
通过dtype=torch.float32指定t张量的类型
import torch
t = torch.tensor([[1, 0, 1, 1]], dtype=torch.float32).T
p = torch.rand(4,1)
loss_fn = torch.nn.BCEWithLogitsLoss()
print(loss_fn(p, t))

原文链接:https://blog.csdn.net/loki2018/article/details/127210390

### 回答1: nn.BCELoss()和nn.CrossEntropyLoss()是PyTorch库中常用的损失函数。 nn.BCELoss()是二分类问题中使用的二元交叉熵损失函数。这个函数适用于输出数据为概率值的情况,如sigmoid函数输出的概率值。它计算每个样本的损失然后对它们取平均值。BCE代表二元交叉熵(binary cross entropy)。这个损失函数可以反映模型预测结果与真实标签之间的差距,并帮助模型通过梯度下降来更新网络参数,使得预测结果与真实标签尽可能接近。 nn.CrossEntropyLoss()是多分类问题中使用的交叉熵损失函数。这个函数适用于输出数据为类别索引的情况,如使用softmax函数进行多分类任务的结果。它将模型预测的概率分布与真实标签之间的差异转化为一个标量损失值。CrossEntropy代表交叉熵损失,它将每个样本的预测概率与真实标签对应位置的真实概率进行比较,并对它们进行求和然后取平均。这个损失函数可以帮助模型学习到正确的类别预测,使得预测的概率分布与真实标签的概率分布尽可能接近。 综上所述,nn.BCELoss()适用于二分类问题,计算模型输出概率值与真实标签之间的差异;而nn.CrossEntropyLoss()适用于多分类问题,计算模型输出概率分布与真实标签之间的差异。 ### 回答2: nn.BCELoss()和nn.CrossEntropyLoss()都是PyTorch中用于计算损失函数的类。 nn.BCELoss()是二分类问题中使用的损失函数,用于计算二分类交叉熵损失。它将模型的输出与目标标签进行比较,并计算每个样本的二进制交叉熵损失。如果目标标签是正类,则损失函数会惩罚模型输出为负类的程度,反之亦然。nn.BCELoss()常用于二分类任务中,例如图像分类中的两类分割、异常检测等。 nn.CrossEntropyLoss()则用于多分类问题中,计算多分类交叉熵损失。它接受模型的输出和目标标签,并计算每个样本的交叉熵损失。在多分类问题中,目标标签需用One-Hot编码或整数类型表示。nn.CrossEntropyLoss()会将模型输出进行softmax处理,再与目标标签进行比较,计算交叉熵损失。它对于多分类问题是常用的损失函数。 总结: 1. nn.BCELoss()适用于二分类问题,计算二分类交叉熵损失。 2. nn.CrossEntropyLoss()适用于多分类问题,计算多分类交叉熵损失。 两者主要区别在于输入形式和模型输出的处理方式。 ### 回答3: nn.BCELoss()和nn.CrossEntropyLoss()都是PyTorch框架中常用的损失函数。它们的差异在于应用的场景和处理方式不同。 nn.BCELoss()是二分类问题的损失函数,适用于输出为概率值的情况。它的全称是Binary Cross Entropy Loss,用于衡量模型输出的概率与真实标签之间的差异。该损失函数采用式子:Loss = -[y*log(x) + (1-y)*log(1-x)],其中y是真实标签,x是模型输出的概率。nn.BCELoss()常用于输出值为0或1的二分类任务,比如判断图像中是否包含某个物体。 nn.CrossEntropyLoss()是多分类问题的损失函数,适用于输出为类别的情况。它的全称是Cross Entropy Loss,用于衡量模型输出的类别预测值与真实标签之间的差异。该损失函数采用式子:Loss = -[y*log(x)],其中y是真实标签的类别索引,x是模型输出的类别概率分布。nn.CrossEntropyLoss()将分类问题转化为一个概率分布的差异度量,常用于多分类任务,比如图像分类、文本分类等。 两者之间的区别主要在于输入形式和问题类型不同。nn.BCELoss()适用于二分类问题,输出为概率值;nn.CrossEntropyLoss()适用于多分类问题,输出为类别。同时需要注意的是,对于二分类问题,可以使用nn.CrossEntropyLoss()代替nn.BCELoss(),只是需要设置输出类别为2。而对于多分类问题,如果输出为概率值,则可以使用nn.BCELoss(),但需要将输出进行二值化处理。 综上所述,nn.BCELoss()和nn.CrossEntropyLoss()是PyTorch框架中常用的损失函数,用于不同类型的分类问题。根据具体的问题和输出类型,选择合适的损失函数可以提高模型训练的效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值