РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
538 of 769 menu

Класс 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,
    который также хорошо работает с бинарной кросс-энтропией
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить