Spec-Zone.ru › PyTorch 1

BCEWithLogitsLoss

class torch.nn.BCEWithLogitsLoss(weight=None, size_average=None, reduce=None, reduction='mean', pos_weight=None) [source]

Этот класс объединяет слой 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. Функция потерь будет вести себя так, как будто в наборе данных 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...)
Параметры:
  • weight (Tensor, необязательно) – ручное значение масштабирования, применяемое к потере каждого элемента пакета. Если задано, должно быть тензором размера nbatch.
  • 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, необязательно) – вес положительных примеров. Должен быть вектором длиной, равной количеству классов.
Форма:
  • Вход: (∗)(*), где ∗* означает любое количество измерений.
  • Цель: (∗)(*), такая же форма, как у входа.
  • Вывод: скаляр. Если reduction равно 'none', то (∗)(*), такая же форма, как у входа.

Примеры:

>>> loss = nn.BCEWithLogitsLoss()
>>> input = torch.randn(3, requires_grad=True)
>>> target = torch.empty(3).random_(2)
>>> output = loss(input, target)
>>> output.backward()

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

Spec-Zone.ru

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