关于nn.BCEWithLogitsLoss()与nn.CrossEntropyLoss()的手动计算过程(都可用于多分类,不仅仅用于二分类)

本文详细介绍了nn.BCEWithLogitsLoss和nn.CrossEntropyLoss在多分类任务中的使用,包括它们的计算过程、输入格式及自带的归一化函数。nn.BCEWithLogitsLoss适用于标签为浮点形式,自带sigmoid;nn.CrossEntropyLoss适用于标签为整数形式,自带softmax。同时,文章讨论了两者的联系和区别,强调了在损失计算中类别间联系的不同处理方式。
摘要由CSDN通过智能技术生成

 使用nn.BCEWithLogitsLoss()

#pred和label都是2d的情况,行数表示有几个样本
#第1列是预测为标签0的分数,第2列是预测为标签1的分数,第3列是预测为标签2的概率,有3种标签
# 下面为nn.BCEWithLogitsLoss()的输入概率,和正确标签(float类型)的格式(输入概率和正确标签的shape相同,2d情况)
pred_1 = torch.tensor([[-0.2,0.6,0.4],
                      [0.2,0.1,0.5],
                      [0.3,0.8,0.9]])                       
label_1 = torch.tensor([[1,0,1],   #表示第一个样本既属于标签0也属于标签2
                        [1,0,0],   #表示第二个样本仅仅属于标签0
                        [0,1,1]])   #表示第三个样本既属于标签1也属于标签2

print('nn.BCEWithLogitsLoss())(pred,label) = ',nn.BCEWithLogitsLoss()(pred_1,label_1.float())) #tensor(0.6924)
print('nn.BCEWithLogitsLoss()(pred,label) = nn.BCELoss()(torch.sigmoid(pred),label)=',nn.BCELoss()(torch.sigmoid(pred_1),label_1.float()))
print('下面分3个步骤计算')
print('step 1,使用sigmoid归一化预测概率pred')
pred_1_sigmoid = torch.sigmoid(pred_1) #;print(pred_1_sigmoid)
# tensor([[0.4502, 0.6457, 0.5987],
#         [0.5498, 0.5250, 0.6225],
#         [0.5744, 0.6900, 0.7109]])
print('step 2,分别计算每个样本的损失')
#计算第一个样本的损失,第一个样本的标签为 (1,0,1)
sample_1_loss = -1*(1*torch.log(torch.tensor(0.4502)) + 0*torch.log(1-torch.tensor(0.4502)) +
              0*torch.log(torch.tenso
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值