0


二分类损失 - BCELoss详解

BCELoss (Binary Cross-Entropy Loss) 是用于二分类问题的损失函数。它用于评估预测值和实际标签之间的差异。在 PyTorch 中,

BCELoss

是一个常用的损失函数。以下是 BCELoss 的详细计算过程和代码实现。

BCELoss 的计算过程

给定一组预测值

      y 
     
    
      ^ 
     
    
   
  
    \hat{y} 
   
  
y^​ 和实际标签  
 
  
   
   
     y 
    
   
  
    y 
   
  
y,BCELoss 的公式如下:


  
   
    
    
      BCELoss 
     
    
      ( 
     
    
      y 
     
    
      , 
     
     
     
       y 
      
     
       ^ 
      
     
    
      ) 
     
    
      = 
     
    
      − 
     
     
     
       1 
      
     
       N 
      
     
     
     
       ∑ 
      
      
      
        i 
       
      
        = 
       
      
        1 
       
      
     
       N 
      
     
     
     
       [ 
      
      
      
        y 
       
      
        i 
       
      
     
       log 
      
     
       ⁡ 
      
     
       ( 
      
      
       
       
         y 
        
       
         ^ 
        
       
      
        i 
       
      
     
       ) 
      
     
       + 
      
     
       ( 
      
     
       1 
      
     
       − 
      
      
      
        y 
       
      
        i 
       
      
     
       ) 
      
     
       log 
      
     
       ⁡ 
      
     
       ( 
      
     
       1 
      
     
       − 
      
      
       
       
         y 
        
       
         ^ 
        
       
      
        i 
       
      
     
       ) 
      
     
       ] 
      
     
    
   
     \text{BCELoss}(y, \hat{y}) = - \frac{1}{N} \sum_{i=1}^{N} \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] 
    
   
 BCELoss(y,y^​)=−N1​i=1∑N​[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]

其中:

  •                                     N                                  N                     N 是样本数。
    
  •                                                y                               i                                            y_i                     yi​ 是第                                         i                                  i                     i 个样本的实际标签,取值为 0 或 1。
    
  •                                                            y                                  ^                                          i                                            \hat{y}_i                     y^​i​ 是第                                         i                                  i                     i 个样本的预测值,取值范围在 (0, 1) 之间。
    

计算步骤

  1. 计算每个样本的损失: 对于每个样本,根据公式 y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) yi​log(y^​i​)+(1−yi​)log(1−y^​i​) 计算损失。
  2. 取反: 对上述结果取负,即 − [ y i log ⁡ ( y ^ i ) + ( 1 − y i ) log ⁡ ( 1 − y ^ i ) ] - \left[ y_i \log(\hat{y}_i) + (1 - y_i) \log(1 - \hat{y}_i) \right] −[yi​log(y^​i​)+(1−yi​)log(1−y^​i​)]。
  3. 求平均值: 对所有样本的损失取平均值。

PyTorch 中的代码实现

以下是一个完整的代码示例,展示了如何在 PyTorch 中使用

BCELoss

计算损失。

import torch
import torch.nn as nn

# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1,0.9,0.8,0.3], dtype=torch.float32)
labels = torch.tensor([0,1,1,0], dtype=torch.float32)# 初始化 BCELoss
criterion = nn.BCELoss()# 计算损失
loss = criterion(predictions, labels)print(f"Binary Cross-Entropy Loss: {loss.item()}")

手动计算过程的实现

我们也可以手动实现 BCELoss 以理解其计算过程。以下是手动计算的代码示例:

import torch

# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1,0.9,0.8,0.3], dtype=torch.float32)
labels = torch.tensor([0,1,1,0], dtype=torch.float32)# 计算每个样本的损失
loss =-(labels * torch.log(predictions)+(1- labels)* torch.log(1- predictions))# 求平均值
loss = loss.mean()print(f"Manually calculated Binary Cross-Entropy Loss: {loss.item()}")

解释

  1. 预测值 (predictions) 和 **标签 (labels)**: 这是两个张量,分别代表模型的预测结果和真实标签。
  2. **nn.BCELoss()**: 这是 PyTorch 中的二分类交叉熵损失函数。
  3. **损失计算 (criterion(predictions, labels))**: 调用 BCELoss 对象计算预测值和标签之间的损失。

通过上述代码示例,我们可以看到如何在 PyTorch 中使用

BCELoss

计算损失以及手动计算该损失的过程。这样可以帮助更好地理解该损失函数的工作原理。

在 PyTorch 中,

nn.BCELoss

是用于计算二分类交叉熵损失的类。这个类有一些参数可以用来调整其行为。以下是对

nn.BCELoss

的参数的详细讲解。

nn.BCELoss

的参数

  1. weight (optional):- 类型:Tensor- 说明:对每个样本的损失进行加权。如果提供了权重张量 weight,则会对每个样本的损失乘以相应的权重。- 使用场景:当需要对样本的重要性进行区分时使用。例如,某些样本可能比其他样本更重要,可以为这些样本赋予更高的权重。
  2. reduction (optional):- 类型:字符串,值可以是 'none''mean''sum'- 说明: - 'none':不进行任何 reduction,直接返回每个样本的损失。- 'mean':对所有样本的损失取平均值(默认值)。- 'sum':对所有样本的损失求和。- 使用场景:根据需要调整输出的损失形式。例如,在某些情况下,可能需要查看每个样本的损失值,而不是平均损失值。

示例代码

下面的示例代码展示了如何使用这些参数:

import torch
import torch.nn as nn

# 创建一个示例输入(预测值)和标签
predictions = torch.tensor([0.1,0.9,0.8,0.3], dtype=torch.float32)
labels = torch.tensor([0,1,1,0], dtype=torch.float32)# 使用 weight 参数
weights = torch.tensor([1.0,0.5,2.0,1.0], dtype=torch.float32)
criterion_with_weights = nn.BCELoss(weight=weights)
loss_with_weights = criterion_with_weights(predictions, labels)print(f"Binary Cross-Entropy Loss with weights: {loss_with_weights.item()}")# 使用 reduction 参数为 'none'
criterion_no_reduction = nn.BCELoss(reduction='none')
loss_no_reduction = criterion_no_reduction(predictions, labels)print(f"Binary Cross-Entropy Loss with no reduction: {loss_no_reduction}")# 使用 reduction 参数为 'sum'
criterion_sum_reduction = nn.BCELoss(reduction='sum')
loss_sum_reduction = criterion_sum_reduction(predictions, labels)print(f"Binary Cross-Entropy Loss with sum reduction: {loss_sum_reduction.item()}")# 使用 reduction 参数为 'mean'(默认)
criterion_mean_reduction = nn.BCELoss()
loss_mean_reduction = criterion_mean_reduction(predictions, labels)print(f"Binary Cross-Entropy Loss with mean reduction (default): {loss_mean_reduction.item()}")

解释

  1. weight 参数:- 在创建 BCELoss 对象时,通过 weight 参数传递一个权重张量。该权重张量的长度应与预测值和标签的长度相同。- criterion_with_weights = nn.BCELoss(weight=weights): 创建一个带权重的损失函数。- loss_with_weights = criterion_with_weights(predictions, labels): 计算带权重的损失值。
  2. reduction 参数:- 'none':不进行任何 reduction,直接返回每个样本的损失。criterion_no_reduction = nn.BCELoss(reduction='none')loss_no_reduction = criterion_no_reduction(predictions, labels)- 'sum':对所有样本的损失求和。criterion_sum_reduction = nn.BCELoss(reduction='sum')loss_sum_reduction = criterion_sum_reduction(predictions, labels)- 'mean':对所有样本的损失取平均值(默认)。criterion_mean_reduction = nn.BCELoss()loss_mean_reduction = criterion_mean_reduction(predictions, labels)

通过调整这些参数,

nn.BCELoss

可以更灵活地适应不同的应用场景和需求。


本文转载自: https://blog.csdn.net/weixin_47552266/article/details/140738355
版权归原作者 想胖的壮壮 所有, 如有侵权,请联系我们删除。

“二分类损失 - BCELoss详解”的评论:

还没有评论