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

Класс SoftMarginLoss

Класс SoftMarginLoss предназначен для бинарной классификации. Он вычисляет потери, применяя сигмоидное преобразование к входным данным и затем вычисляя логистическую функцию потерь между полученными вероятностями и целевыми метками. Данный класс полезен в задачах, где необходимо получить вероятности принадлежности к классам, не прибегая к явному применению функции sigmoid.

Основное преимущество SoftMarginLoss заключается в том, что он объединяет сигмоидное преобразование и вычисление потерь в одном шаге, что делает процесс обучения более стабильным и численно устойчивым. Входные данные могут быть любыми вещественными числами, а целевые метки должны быть представлены в виде чисел -1 и 1.

Синтаксис

torch.nn.SoftMarginLoss(size_average=None, reduce=None, reduction='mean')

Класс принимает следующие параметры:

  • reduction - определяет способ агрегации потерь. Возможные значения: 'none' - потери возвращаются поэлементно, 'mean' - вычисляется среднее значение, 'sum' - вычисляется сумма. По умолчанию 'mean'.

Пример

Давайте создадим экземпляр класса и применим его к простым данным:

import torch # Создаём функцию потерь loss_fn = torch.nn.SoftMarginLoss() # Входные данные pred = torch.tensor([0.5, -1.2, 2.0, -0.8]) target = torch.tensor([1.0, -1.0, 1.0, -1.0]) # Вычисляем потери loss = loss_fn(pred, target) print(loss)

Результат выполнения кода:

tensor(0.5838)

Как видно из примера, функция потерь возвращает скалярное значение при стандартных настройках.

Пример

Рассмотрим пример с параметром reduction='none', который возвращает поэлементные потери:

import torch # Создаём функцию потерь без агрегации loss_fn = torch.nn.SoftMarginLoss(reduction='none') # Входные данные pred = torch.tensor([0.5, -1.2, 2.0, -0.8]) target = torch.tensor([1.0, -1.0, 1.0, -1.0]) # Вычисляем потери loss = loss_fn(pred, target) print(loss)

Результат выполнения кода:

tensor([0.4741, 0.4375, 0.1269, 1.2966])

В данном случае мы получаем тензор той же размерности, что и входные данные, где каждый элемент представляет собой потерю для соответствующей пары предсказание-цель.

Пример

Давайте рассмотрим использование SoftMarginLoss в процессе обучения простой нейронной сети:

import torch # Фиксируем случайное зерно для воспроизводимости torch.manual_seed(0) # Создаём простую модель model = torch.nn.Linear(5, 1) loss_fn = torch.nn.SoftMarginLoss() optimizer = torch.optim.SGD(model.parameters(), lr=0.01) # Создаём случайные данные x = torch.randn(10, 5) y = torch.tensor([1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0]) # Один шаг обучения optimizer.zero_grad() pred = model(x).squeeze() loss = loss_fn(pred, y) loss.backward() optimizer.step() print(f"Loss: {loss.item():.4f}")

Результат выполнения кода:

Loss: 0.7001

В этом примере мы создали простой линейный слой, который принимает 5-мерные входные данные и выдаёт скалярное предсказание. Затем мы используем SoftMarginLoss для вычисления потерь и выполняем один шаг оптимизации.

Смотрите также

  • функцию потерь BCEWithLogitsLoss,
    которая объединяет сигмоидное преобразование с бинарной кросс-энтропией
  • функцию потерь MultiLabelSoftMarginLoss,
    которая является многоклассовым аналогом SoftMarginLoss
  • функцию потерь HingeEmbeddingLoss,
    которая используется для задач обучения метрик
  • функцию потерь MarginRankingLoss,
    которая вычисляет потери для ранжирования
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить