Función PyTorch torch.nn.BCEWithLogitsLoss
Manual de referencia de PyTorch torch.nn
torch.nn.BCEWithLogitsLossEs la función de pérdida de entropía cruzada binaria (con Sigmoid) en PyTorch.
Combina Sigmoid y BCE, es numéricamente más estable y se utiliza para tareas de clasificación binaria.
Definición de la función
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
Parámetros:
weight: pesos manualespos_weight: pesos de la clase positiva, para desequilibrio de clases
Ejemplos de uso
Ejemplo 1: Uso básico
Ejemplo
import torch
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# logits no normalizados
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# etiquetas binarias
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("BCE Loss:", loss.item())
# verificación manual: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE manual:", bce.item())
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# logits no normalizados
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# etiquetas binarias
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("BCE Loss:", loss.item())
# verificación manual: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE manual:", bce.item())
Ejemplo 2: Desequilibrio de clases
Ejemplo
import torch
import torch.nn as nn
# pesos de la clase positiva: aumentar la importancia de las muestras positivas
pos_weight = torch.tensor([5.0])
criterion = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
logits = torch.randn(10, 1)
targets = torch.zeros(10, 1)
targets[:2] = 1.0 # muy pocas muestras positivas
loss = criterion(logits, targets)
print("Pérdida BCE ponderada:", loss.item())
import torch.nn as nn
# pesos de la clase positiva: aumentar la importancia de las muestras positivas
pos_weight = torch.tensor([5.0])
criterion = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
logits = torch.randn(10, 1)
targets = torch.zeros(10, 1)
targets[:2] = 1.0 # muy pocas muestras positivas
loss = criterion(logits, targets)
print("Pérdida BCE ponderada:", loss.item())
Ejemplo 3: Clasificación de múltiples etiquetas
Ejemplo
import torch
import torch.nn as nn
# clasificación binaria de múltiples etiquetas
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 clases, cada una puede ser 0 o 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Pérdida de múltiples etiquetas:", loss.item())
import torch.nn as nn
# clasificación binaria de múltiples etiquetas
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 clases, cada una puede ser 0 o 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Pérdida de múltiples etiquetas:", loss.item())
Casos de uso
- Clasificación binaria: etiqueta única
- Clasificación de múltiples etiquetas: cada etiqueta es independiente
- Desequilibrio de clases: usar pos_weight
Nota: la entrada son logits, no se necesita aplicar Sigmoid previamente.
Otras extensiones