Функция torch.nn.BCEWithLogitsLoss в PyTorch
Справочное руководство PyTorch torch.nn
torch.nn.BCEWithLogitsLossЭто функция потерь бинарной кросс-энтропии (с Sigmoid) в PyTorch.
Она объединяет Sigmoid и BCE, что делает её численно более устойчивой; используется для задач бинарной классификации.
Определение функции
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
Параметры:
weight: Ручные весаpos_weight: Вес положительного класса, используется при дисбалансе классов
Примеры использования
Пример 1: Базовое использование
Пример
import torch
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# Ненормализованные логиты
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Бинарные метки
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("Потеря BCE:", loss.item())
# Ручная проверка: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE вручную:", bce.item())
import torch.nn as nn
criterion = nn.BCEWithLogitsLoss()
# Ненормализованные логиты
logits = torch.tensor([2.0, -1.0, 0.5, -3.0])
# Бинарные метки
targets = torch.tensor([1.0, 0.0, 1.0, 0.0])
loss = criterion(logits, targets)
print("Потеря BCE:", loss.item())
# Ручная проверка: Sigmoid + BCE
sigmoid = torch.sigmoid(logits)
bce = nn.BCELoss()(sigmoid, targets)
print("BCE вручную:", bce.item())
Пример 2: Дисбаланс классов
Пример
import torch
import torch.nn as nn
# Вес положительного класса: увеличить важность положительных примеров
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 # Положительный класс встречается редко
loss = criterion(logits, targets)
print("Взвешенная потеря BCE:", loss.item())
import torch.nn as nn
# Вес положительного класса: увеличить важность положительных примеров
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 # Положительный класс встречается редко
loss = criterion(logits, targets)
print("Взвешенная потеря BCE:", loss.item())
Пример 3: Многометочная классификация
Пример
import torch
import torch.nn as nn
# Многометочная бинарная классификация
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 классов, каждый может быть 0 или 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Многометочная потеря:", loss.item())
import torch.nn as nn
# Многометочная бинарная классификация
criterion = nn.BCEWithLogitsLoss()
# batch=4, 5 классов, каждый может быть 0 или 1
logits = torch.randn(4, 5)
labels = torch.randint(0, 2, (4, 5)).float()
loss = criterion(logits, labels)
print("Многометочная потеря:", loss.item())
Сценарии использования
- Бинарная классификация: Одна метка
- Многометочная классификация: Каждая метка независима
- Дисбаланс классов: Используйте pos_weight
Примечание: на входе — logits, применять Sigmoid заранее не нужно.
Другие расширения