PyTorch torch.nn.BCEWithLogitsLoss-Funktion
PyTorch torch.nn Referenzhandbuch
torch.nn.BCEWithLogitsLossEs ist die binäre Kreuzentropie-Verlustfunktion (mit Sigmoid) in PyTorch.
Es kombiniert Sigmoid und BCE, wodurch es numerisch stabiler ist, und wird für binäre Klassifikationsaufgaben verwendet.
Funktionsdefinition
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
Parameter:
weight: Manuelle Gewichtepos_weight: Gewicht der positiven Klasse, verwendet bei Klassenungleichgewicht
Anwendungsbeispiele
Beispiel 1: Grundlegende Verwendung
Beispiel
import torch
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# Unnormalisierte Logits
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Binäre Labels
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("BCE-Verlust:", loss.item())
# Manuelle Überprüfung: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("Manuelles BCE:", bce.item())
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# Unnormalisierte Logits
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Binäre Labels
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("BCE-Verlust:", loss.item())
# Manuelle Überprüfung: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("Manuelles BCE:", bce.item())
Beispiel 2: Klassenungleichgewicht
Beispiel
import torch
import torch.nn as nn
# Gewicht der positiven Klasse: die Wichtigkeit positiver Beispiele erhöhen
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 # Positive Klasse ist selten
loss = criterion(logits, targets)
print("Gewichteter BCE-Verlust:", loss.item())
import torch.nn as nn
# Gewicht der positiven Klasse: die Wichtigkeit positiver Beispiele erhöhen
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 # Positive Klasse ist selten
loss = criterion(logits, targets)
print("Gewichteter BCE-Verlust:", loss.item())
Beispiel 3: Multi-Label-Klassifikation
Beispiel
import torch
import torch.nn as nn
# Multi-Label-Binärklassifikation
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 Klassen, jede kann 0 oder 1 sein
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Multi-Label-Verlust:", loss.item())
import torch.nn as nn
# Multi-Label-Binärklassifikation
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 Klassen, jede kann 0 oder 1 sein
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Multi-Label-Verlust:", loss.item())
Anwendungsfälle
- Binärklassifikation: Einzelnes Label
- Multi-Label-Klassifikation: Jedes Label ist unabhängig
- Klassenungleichgewicht: pos_weight verwenden
Hinweis: Eingabe sind Logits, Sigmoid muss nicht vorher angewendet werden.
Andere Erweiterungen