赞
踩
BCELoss 和 BCEWithLogitsLoss 都是用于二分类任务的损失函数,但它们在使用上有一些区别。
input:经过 Sigmoid 函数激活后的预测概率 + 对应的真实标签(一般使用one-hot表示)
BCELoss:BCELoss 是二元交叉熵损失函数(Binary Cross Entropy Loss)的简写。它的输入是经过 Sigmoid 函数激活后的预测概率和对应的真实标签(一般使用one-hot表示)。BCELoss 计算的是预测概率和真实标签之间的二元交叉熵损失,通过最小化该损失来优化模型。
比如我们一个样本y有3个类别,那么我们通过softmax得到 “ y^ = [ 0.2 , 0.5 , 0.3 ] ”一个一个样本的分类结果,这个结果的通俗解释就是:为第一类的概率为0.2,为第二类的概率为0.5,为第三类的结果过0.3。假设这个样本真实类别为第二类,那么我们希望模型输出的结果过应该是y = [ 0 , 1 , 0 ],这个就是标签值。就可以求损失函数了。
在图片多标签分类时,如果3张图片分3类,会输出一个3*3的矩阵(3张图片属于3种类别的概率,每一行代表一张图片,一行中的3个元素代表属于三种类别的概率)。
先用Sigmoid给这些值都搞到0~1之间:
假设Target是:
下面我们用BCELoss来验证一下Loss是不是0.7194!
input:没有经过 Sigmoid 函数激活的预测概率 + 对应的真实标签(一般使用one-hot表示)
BCEWithLogitsLoss:BCEWithLogitsLoss 结合了 Sigmoid 函数和BCE交叉熵损失。它的输入是未经过 Sigmoid 函数转换的模型输出 logits 和对应的真实标签。BCEWithLogitsLoss 内部会在计算中自动应用 Sigmoid 函数,将 logits 转换为预测概率,然后计算二元交叉熵损失。BCEWithLogitsLoss 的优势在于BCEWithLogitsLoss就是把Sigmoid + BCELoss合成一步,更加高效。
我们直接用刚刚的input验证一下是不是0.7193:
- import torch
- import torch.nn as nn
-
- # 假设我们有一些预测值和目标值
- predicted = torch.FloatTensor([2, -1, 0, 5])
- target = torch.FloatTensor([1, 0, 1, 0])
-
- # 初始化BCEWithLogitsLoss
- criterion = nn.BCEWithLogitsLoss()
-
- # 计算loss
- loss = criterion(predicted, target)
- print(loss)
-
- # 反向传播计算梯度
- loss.backward()
predicted = [2, -1, 0, 5]表示4个样本的预测logits值:
备注:什么是logtis?深度学习logits是什么?_logits层_HealthScience的博客-CSDN博客
注意1:这里和交叉熵损失一样,需要先实例化才可以使用, 也就是说,需要:
# 初始化BCEWithLogitsLoss
criterion = nn.BCEWithLogitsLoss()# 计算loss
loss = criterion(predicted, target)而不能直接:
loss = nn.BCEWithLogitsLoss(predicted, target)
注意2:输入的顺序是predict、true,不要搞反
而target = [1, 0, 1, 0] 表示第一个和第三个样本的真实标签为正样本1,第二和第四个样本的真实标签为负样本0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。