Fonction torch.nn.BCEWithLogitsLoss de PyTorch
Manuel de référence torch.nn de PyTorch
torch.nn.BCEWithLogitsLossIl s'agit de la fonction de perte d'entropie croisée binaire (avec Sigmoid) dans PyTorch.
Elle combine Sigmoid et BCE, ce qui la rend numériquement plus stable, utilisée pour les tâches de classification binaire.
Définition de fonction
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
Paramètres :
weight: poids manuelspos_weight: poids de la classe positive, utilisé pour le déséquilibre de classes
Exemples d'utilisation
Exemple 1 : Utilisation de base
Exemple
import torch
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# logits non normalisés
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Étiquettes binaires
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("Perte BCE :", loss.item())
# Vérification manuelle : Sigmoïde + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE manuelle :", bce.item())
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# logits non normalisés
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Étiquettes binaires
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("Perte BCE :", loss.item())
# Vérification manuelle : Sigmoïde + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE manuelle :", bce.item())
Exemple 2 : Déséquilibre des classes
Exemple
import torch
import torch.nn as nn
# Poids de la classe positive : augmenter l'importance des échantillons positifs
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 # La classe positive est rare
loss = criterion(logits, targets)
print("Perte BCE pondérée :", loss.item())
import torch.nn as nn
# Poids de la classe positive : augmenter l'importance des échantillons positifs
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 # La classe positive est rare
loss = criterion(logits, targets)
print("Perte BCE pondérée :", loss.item())
Exemple 3 : Classification multi-étiquettes
Exemple
import torch
import torch.nn as nn
# Classification binaire multi-étiquettes
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 classes, chacune peut être 0 ou 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Perte multi-étiquettes :", loss.item())
import torch.nn as nn
# Classification binaire multi-étiquettes
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 classes, chacune peut être 0 ou 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Perte multi-étiquettes :", loss.item())
Cas d'utilisation
- Classification binaire: étiquette unique
- Classification multi-étiquettes: chaque étiquette est indépendante
- Déséquilibre des classes: Utiliser pos_weight
Remarque : l'entrée correspond à des logits, pas besoin d'appliquer Sigmoid au préalable.
Autres extensions