Класс BCEWithLogitsLoss
Класс BCEWithLogitsLoss вычисляет бинарную кросс-энтропию между целевыми значениями и выходными данными модели, которые являются логитами (то есть сырыми выходами без применения сигмоиды). Это объединение операций сигмоиды и бинарной кросс-энтропии в одну функцию обеспечивает большую численную стабильность по сравнению с раздельным применением sigmoid и BCELoss. Первым параметром конструктора можно передать вес для каждого элемента, а также указать параметры редукции и другие настройки.
Синтаксис
torch.nn.BCEWithLogitsLoss(weight=None, reduction='mean', pos_weight=None)
Параметры:
weight- тензор весов для каждого элементаreduction- метод редукции: 'none', 'mean', 'sum'pos_weight- вес для положительных примеров
Пример
Создадим функцию потерь и применим к простым данным:
import torch
import torch.nn as nn
torch.manual_seed(0)
loss = nn.BCEWithLogitsLoss()
pred = torch.tensor([2.5, -1.0, 0.5])
target = torch.tensor([1.0, 0.0, 1.0])
res = loss(pred, target)
print(res)
Результат выполнения кода:
tensor(0.2523)
Обратите внимание, что входные данные не проходят через сигмоиду - это делается внутри функции.
Пример
Используем положительные веса для балансировки классов:
import torch
import torch.nn as nn
torch.manual_seed(0)
pos_weight = torch.tensor([3.0])
loss = nn.BCEWithLogitsLoss(pos_weight=pos_weight)
pred = torch.tensor([[1.5], [-0.5], [0.2]])
target = torch.tensor([[1.0], [0.0], [1.0]])
res = loss(pred, target)
print(res)
Результат выполнения кода:
tensor(0.5788)
В этом примере положительные примеры имеют вес 3.0, что помогает справиться с дисбалансом классов.
Пример
Применим функцию потерь без редукции, чтобы получить поэлементные значения:
import torch
import torch.nn as nn
torch.manual_seed(0)
loss = nn.BCEWithLogitsLoss(reduction='none')
pred = torch.tensor([2.0, -1.0, 0.0])
target = torch.tensor([1.0, 0.0, 1.0])
res = loss(pred, target)
print(res)
Результат выполнения кода:
tensor([0.1269, 0.3133, 0.6931])
Теперь мы видим значение потерь для каждого элемента отдельно.
Пример
Пример использования в процессе обучения модели:
import torch
import torch.nn as nn
torch.manual_seed(0)
model = nn.Linear(5, 1)
loss = nn.BCEWithLogitsLoss()
optimizer = torch.optim.SGD(model.parameters(), lr=0.01)
x = torch.randn(4, 5)
y = torch.randint(0, 2, (4, 1)).float()
pred = model(x)
res = loss(pred, y)
print(res)
res.backward()
optimizer.step()
Результат выполнения кода:
tensor(1.5110, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)
Здесь мы видим значение функции потерь, которое затем используется для обратного распространения ошибки.
Смотрите также
-
функцию
BCELoss,
которая вычисляет бинарную кросс-энтропию, но требует применения сигмоиды к входным данным -
класс
CrossEntropyLoss,
который является аналогом для многоклассовой классификации -
оптимизатор
SGD,
который часто используется вместе с этой функцией потерь -
оптимизатор
Adam,
который также хорошо работает с бинарной кросс-энтропией