pytorch中的BCELoss与BCEWithLogitsLoss实现

本文探讨了PyTorch中BCELoss和BCEWithLogitsLoss两种常用的损失函数,重点讲解了它们如何使用不同的对数函数底数,并通过代码实例展示了两者的计算过程。理解这一细节对于深度学习任务的优化至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

pytorch中的BCELoss与BCEWithLogitsLoss计算交叉采用的对数函数的底为自然对数e,下面代码是直接调用函数和代码实现。

import torch
import torch.nn as nn

input = torch.FloatTensor([[ -0.4089,  -1.2471,  0.5907],
        [ -0.4897, -0.8267,  -0.7349],
        [ 0.5241,  -0.1246, -0.4751]])
print(input)
target = torch.FloatTensor([[0, 1, 1],
                            [0, 0, 1],
                            [1, 0, 1]])

m = nn.Sigmoid()
sigmoid_res = m(input)
loss = nn.BCELoss()
# 公式为-1/n * (累加(y*lnx + (1-y)* ln(1-x)))
res = loss(sigmoid_res, target)
print(res)

#BCEWithLogitsLoss就是把Sigmoid-BCELoss合成一步。
loss1 = nn.BCEWithLogitsLoss()
res1 = loss1(input, target)
print(res1) #tensor(0.7193)

res2 = torch.Tensor([0.0])
for i in range(3):
    for j in range(3):
        print(i,j,res2)
        res2 += target[i,j] * torch.log(sigmoid_res[i,j]) + (1-target[i,j]) * torch.log(1-sigmoid_res[i,j])
res2 = -1 * res2 / 9
print('res2', res2)

运行结果:

 参考文献:

1.pytorch中的BCELoss与BCEWithLogitsLoss

2.交叉熵(Cross-Entropy)

### BCELossBCEWithLogitsLoss 的区别 在 PyTorch 中,`BCELoss` 是二元交叉熵损失函数的一种实现形式。该函数用于衡量预测概率真实标签之间的差异,适用于二分类问题[^1]。 对于 `BCELoss` 来说,输入应当是经过激活函数(通常是 Sigmoid 函数)处理后的值,即这些值已经被映射到 (0, 1) 范围内作为概率估计。这意味着如果直接传入未经变换的原始分数,则可能会导致数值不稳定或者不合理的梯度更新。 相比之下,`BCEWithLogitsLoss` 结合了 Sigmoid 层和二元交叉熵损失计算于一体。此设计不仅简化了模型构建过程中的操作链路,而且更重要的是,在内部实现了更稳定的数值运算方式来防止下溢或上溢现象的发生。 具体来说: - **稳定性**:由于集成了Sigmoid层,因此可以避免因单独应用Sigmoid而可能产生的极端值情况; - **效率提升**:减少了额外一层的操作开销; 下面是一个简单的例子展示如何使用这两种损失函数: ```python import torch import torch.nn as nn # 假设我们有如下数据 logits = torch.tensor([[-2.0], [1.0]], requires_grad=True) labels = torch.tensor([[0.0], [1.0]]) # 使用 BCEWithLogitsLoss loss_fn_with_logits = nn.BCEWithLogitsLoss() loss_with_logits = loss_fn_with_logits(logits, labels) print(f"BCEWithLogitsLoss: {loss_with_logits.item()}") sigmoid_output = torch.sigmoid(logits) # 使用 BCELoss 需要先通过 sigmoid 将 logits 映射到 (0, 1) 区间 loss_fn_without_logits = nn.BCELoss() loss_without_logits = loss_fn_without_logits(sigmoid_output, labels) print(f"BCELoss after applying sigmoid manually: {loss_without_logits.item()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值