Spec-Zone.ru › PyTorch 2.14

BCEWithLogitsLoss

class torch.nn.modules.loss.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None) [исходный код]

Эта функция потерь объединяет слой Sigmoid и BCELoss в одном классе. Эта версия численно стабильнее, чем обычный Sigmoid, за которым следует BCELoss, поскольку объединение операций в один слой позволяет воспользоваться приёмом log-sum-exp для обеспечения численной стабильности.

Нередуцированную функцию потерь (то есть при reduction, равном 'none') можно описать следующим образом:

ℓ(x,y)=L={l1,…,lN}⊤,ln=−wn[yn⋅log⁡σ(xn)+(1−yn)⋅log⁡(1−σ(xn))],\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_n \left[ y_n \cdot \log \sigma(x_n) + (1 - y_n) \cdot \log (1 - \sigma(x_n)) \right],

где NN — размер пакета. Если reduction не равно 'none' (значение по умолчанию — 'mean'), то

ℓ(x,y)={mean⁡(L),если reduction=‘mean’;sum⁡(L),если reduction=‘sum’.\ell(x, y) = \begin{cases} \operatorname{mean}(L), & \text{if reduction} = \text{`mean';}\\ \operatorname{sum}(L), & \text{if reduction} = \text{`sum'.} \end{cases}

Это используется для измерения ошибки реконструкции, например в автоэнкодере. Обратите внимание, что целевые значения t[i] должны быть числами от 0 до 1.

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

ℓc(x,y)=Lc={l1,c,…,lN,c}⊤,ln,c=−wn,c[pcyn,c⋅log⁡σ(xn,c)+(1−yn,c)⋅log⁡(1−σ(xn,c))],\ell_c(x, y) = L_c = \{l_{1,c},\dots,l_{N,c}\}^\top, \quad l_{n,c} = - w_{n,c} \left[ p_c y_{n,c} \cdot \log \sigma(x_{n,c}) + (1 - y_{n,c}) \cdot \log (1 - \sigma(x_{n,c})) \right],

где cc — номер класса (c>1c > 1 для бинарной классификации с несколькими метками, c=1c = 1 для бинарной классификации с одной меткой), nn — номер примера в пакете, а pcp_c — вес положительного ответа для класса cc.

pc>1p_c > 1 увеличивает полноту, а pc<1p_c < 1 увеличивает точность.

Например, если набор данных содержит 100 положительных и 300 отрицательных примеров одного класса, то pos_weight для этого класса должно быть равно 300100=3\frac{300}{100}=3. Функция потерь будет действовать так, как если бы набор данных содержал 3×100=3003\times 100=300 положительных примеров.

Примеры

>>> target = torch.ones([10, 64], dtype=torch.float32)  # 64 classes, batch size = 10
>>> output = torch.full([10, 64], 1.5)  # A prediction (logit)
>>> pos_weight = torch.ones([64])  # All weights are equal to 1
>>> criterion = torch.nn.BCEWithLogitsLoss(pos_weight=pos_weight)
>>> criterion(output, target)  # -log(sigmoid(1.5))
tensor(0.20...)

В приведённом выше примере элементы тензора pos_weight соответствуют 64 различным классам в сценарии бинарной классификации с несколькими метками. Каждый элемент в pos_weight предназначен для корректировки функции потерь с учётом дисбаланса между отрицательными и положительными примерами соответствующего класса. Такой подход полезен для наборов данных с различной степенью дисбаланса классов и позволяет точно учитывать распределение в каждом классе при вычислении функции потерь.

Параметры:
  • weight (Tensor, необязательный) – вручную задаваемый вес для масштабирования функции потерь каждого элемента пакета. Размерность weight поддерживает трансляцию к общей форме относительно формы выходных данных (и целевых значений).
  • size_average (bool, необязательный) – Устарел (см. reduction). По умолчанию значения функций потерь усредняются по всем элементам потерь в пакете. Обратите внимание, что для некоторых функций потерь на каждый пример приходится несколько элементов. Если для поля size_average задано значение False, вместо этого значения функций потерь суммируются для каждого мини-пакета. Игнорируется, если reduce равно False. Значение по умолчанию: True
  • reduce (bool, необязательный) – Устарел (см. reduction). По умолчанию значения функций потерь усредняются или суммируются по наблюдениям для каждого мини-пакета в зависимости от size_average. Если reduce равно False, вместо этого возвращается значение функции потерь для каждого элемента пакета, а size_average игнорируется. Значение по умолчанию: True
  • reduction (str, необязательный) – Определяет способ редукции выходных данных: 'none' | 'mean' | 'sum'. 'none': редукция не применяется, 'mean': сумма выходных данных делится на количество элементов в выходных данных, 'sum': выходные данные суммируются. Примечание: size_average и reduce постепенно выводятся из употребления; пока что указание любого из этих двух аргументов переопределит reduction. Значение по умолчанию: 'mean'
  • pos_weight (Tensor, необязательный) – вес положительных примеров, который будет транслирован к форме целевых значений. Должен быть тензором, размер которого по измерению классов равен числу классов. Чтобы получить желаемые операции, внимательно учитывайте правила трансляции PyTorch. Для целевых данных формы [B, C, H, W] (где B — размер пакета) pos_weight формы [B, C, H, W] задаст разные веса pos_weights для каждого элемента пакета, а формы [C, H, W] — одинаковые веса pos_weights для всего пакета. Чтобы применить одинаковый положительный вес ко всем пространственным измерениям для двумерных целевых данных с несколькими классами формы [C, H, W], используйте: [C, 1, 1]. Значение по умолчанию: None
Форма:
  • Входные данные: (∗)(*), где ∗* означает любое количество измерений.
  • Целевые данные: (∗)(*), той же формы, что и входные данные.
  • Выходные данные: скаляр. Если reduction равно 'none', то (∗)(*), той же формы, что и входные данные.

Примеры

>>> loss = nn.BCEWithLogitsLoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(input, target)
>>> output.backward()
forward(input, target) [исходный код]

Выполняет прямой проход.

Тип возвращаемого значения:

Tensor

© 2026, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://docs.pytorch.org/docs/2.14/generated/torch.nn.modules.loss.BCEWithLogitsLoss.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API