Spec-Zone.ru › PyTorch 2.14

CrossEntropyLoss

class torch.nn.CrossEntropyLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='mean', label_smoothing=0.0) [source]

Этот критерий вычисляет функцию потерь перекрёстной энтропии между входными логитами и целевыми значениями.

Критерий полезен при обучении модели классификации с C классами. Если задан необязательный аргумент weight, он должен быть одномерным Tensor, задающим вес для каждого класса. Это особенно полезно при несбалансированном обучающем наборе.

Ожидается, что input будет содержать ненормализованные логиты для каждого класса (которые в общем случае not должны быть положительными или в сумме давать 1). input должен быть тензором размера (C)(C) для входных данных без пакета, (minibatch,C)(minibatch, C) или (minibatch,C,d1,d2,...,dK)(minibatch, C, d_1, d_2, ..., d_K) для случая K-мерных данных. Последний вариант полезен для входных данных большей размерности, например, для вычисления потерь перекрёстной энтропии для каждого пикселя 2D-изображения.

Ожидается, что target, передаваемый этому критерию, будет содержать одно из следующего:

  • Индексы классов в диапазоне [0,C)[0, C), где CC — количество классов; если задан ignore_index, эта функция потерь также принимает этот индекс класса (он не обязательно должен входить в диапазон индексов классов). Функцию потерь без редукции (то есть при reduction, равном 'none') для этого случая можно описать следующим образом:

    ℓ(x,y)=L={l1,…,lN}⊤,ln=−wynlog⁡exp⁡(xn,yn)∑c=1Cexp⁡(xn,c)⋅1{yn≠ignore_index}\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - w_{y_n} \log \frac{\exp(x_{n,y_n})}{\sum_{c=1}^C \exp(x_{n,c})} \cdot \mathbb{1}\{y_n \not= \text{ignore\_index}\}

    где xx — входные данные, yy — целевые значения, ww — вес, CC — количество классов, а NN охватывает размерность пакета, а также d1,...,dkd_1, ..., d_k для случая K-мерных данных. Если reduction не равен 'none' (по умолчанию 'mean'), то

    ℓ(x,y)={∑n=1N1∑n=1Nwyn⋅1{yn≠ignore_index}ln,если reduction=‘mean’;∑n=1Nln,если reduction=‘sum’.\ell(x, y) = \begin{cases} \sum_{n=1}^N \frac{1}{\sum_{n=1}^N w_{y_n} \cdot \mathbb{1}\{y_n \not= \text{ignore\_index}\}} l_n, & \text{if reduction} = \text{`mean';}\\ \sum_{n=1}^N l_n, & \text{if reduction} = \text{`sum'.} \end{cases}

    Обратите внимание, что этот вариант эквивалентен применению LogSoftmax к входным данным с последующим применением NLLLoss.

  • Вероятности для каждого класса; этот вариант полезен, когда требуются метки, охватывающие несколько классов для одного элемента пакета, например, при смешанных метках, сглаживании меток и т. д. Функцию потерь без редукции (то есть при reduction, равном 'none') для этого случая можно описать следующим образом:

    ℓ(x,y)=L={l1,…,lN}⊤,ln=−∑c=1Cwclog⁡exp⁡(xn,c)∑i=1Cexp⁡(xn,i)yn,c\ell(x, y) = L = \{l_1,\dots,l_N\}^\top, \quad l_n = - \sum_{c=1}^C w_c \log \frac{\exp(x_{n,c})}{\sum_{i=1}^C \exp(x_{n,i})} y_{n,c}

    где xx — входные данные, yy — целевые значения, ww — вес, CC — количество классов, а NN охватывает размерность пакета, а также d1,...,dkd_1, ..., d_k для случая K-мерных данных. Если reduction не равен 'none' (по умолчанию 'mean'), то

    ℓ(x,y)={∑n=1NlnN,если reduction=‘mean’;∑n=1Nln,если reduction=‘sum’.\ell(x, y) = \begin{cases} \frac{\sum_{n=1}^N l_n}{N}, & \text{if reduction} = \text{`mean';}\\ \sum_{n=1}^N l_n, & \text{if reduction} = \text{`sum'.} \end{cases}

Примечание

Производительность этого критерия обычно выше, когда target содержит индексы классов, поскольку это позволяет оптимизировать вычисления. Передавайте target в виде вероятностей классов только в том случае, если одной метки класса на элемент пакета недостаточно.

Параметры:
  • weight (Tensor, необязательный) – задаваемый вручную вес масштабирования для каждого класса. Если задан, должен быть тензором размера C.
  • size_average (bool, необязательный) – Устарел (см. reduction). По умолчанию вычисляется среднее значение потерь по каждому элементу потерь в пакете. Обратите внимание, что для некоторых функций потерь на один образец приходится несколько элементов. Если для поля size_average задано значение False, вместо этого потери суммируются для каждого пакета. Игнорируется, если reduce равно False. По умолчанию: True
  • ignore_index (int, необязательный) – Указывает целевое значение, которое игнорируется и не влияет на градиент входных данных. Если size_average равно True, среднее значение потерь вычисляется по целевым значениям, которые не игнорируются. Обратите внимание, что ignore_index применим только в том случае, если целевые значения содержат индексы классов.
  • reduce (bool, необязательный) – Устарел (см. reduction). По умолчанию потери усредняются или суммируются по наблюдениям в каждом пакете в зависимости от size_average. Если reduce равно False, вместо этого возвращается значение потерь для каждого элемента пакета, а size_average игнорируется. По умолчанию: True
  • reduction (str, необязательный) – Указывает редукцию, применяемую к выходным данным: 'none' | 'mean' | 'sum'. 'none': редукция не применяется, 'mean': вычисляется средневзвешенное значение выходных данных, 'sum': выходные данные суммируются. Примечание: size_average и reduce постепенно выводятся из употребления; пока что указание любого из этих аргументов переопределяет reduction. По умолчанию: 'mean'
  • label_smoothing (float, необязательный) – Число с плавающей точкой в диапазоне [0.0, 1.0]. Задаёт степень сглаживания при вычислении потерь, где 0.0 означает отсутствие сглаживания. Целевые значения становятся смесью исходной истинной метки и равномерного распределения, как описано в статье Переосмысление архитектуры Inception для компьютерного зрения. По умолчанию: 0.00.0.
Форма:
  • Входные данные: форма (C)(C), (N,C)(N, C) или (N,C,d1,d2,...,dK)(N, C, d_1, d_2, ..., d_K), где K≥1K \geq 1 для случая K-мерной функции потерь.
  • Целевые значения: если содержат индексы классов, форма ()(), (N)(N) или (N,d1,d2,...,dK)(N, d_1, d_2, ..., d_K), где K≥1K \geq 1 для случая K-мерной функции потерь, причём каждое значение должно находиться в диапазоне [0,C)[0, C). При использовании индексов классов тип данных целевых значений должен быть long. Если целевые значения содержат вероятности классов, они должны иметь ту же форму, что и входные данные, а каждое значение должно находиться в диапазоне [0,1][0, 1]. Следовательно, при использовании вероятностей классов тип данных целевых значений должен быть float. Обратите внимание, что PyTorch строго не проверяет ограничения вероятностей для вероятностей классов; пользователь должен убедиться, что target содержит корректные распределения вероятностей (подробности см. в разделе примеров ниже).
  • Выходные данные: если reduction равно ‘none’, форма — ()(), (N)(N) или (N,d1,d2,...,dK)(N, d_1, d_2, ..., d_K), где K≥1K \geq 1 для случая K-мерной функции потерь; зависит от формы входных данных. В противном случае результат представляет собой скаляр.

где:

C=количество классовN=размер пакета\begin{aligned} C ={} & \text{number of classes} \\ N ={} & \text{batch size} \\ \end{aligned}

Примеры

>>> # Example of target with class indices
>>> loss = nn.CrossEntropyLoss()
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.empty(3, dtype=torch.long).random_(5)
>>> output = loss(input, target)
>>> output.backward()
>>>
>>> # Example of target with class probabilities
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.randn(3, 5).softmax(dim=1)
>>> output = loss(input, target)
>>> output.backward()

Примечание

Если target содержит вероятности классов, они должны быть мягкими метками, то есть каждая запись target должна представлять распределение вероятностей возможных классов для данного образца данных; отдельные вероятности должны находиться в заданном диапазоне [0,1], а сумма распределения должна равняться 1. Именно поэтому в приведённом выше примере с вероятностями классов к target применяется функция softmax().

PyTorch не проверяет, находятся ли значения, переданные в target, в диапазоне [0,1] и равна ли сумма распределения каждого образца данных значению 1. Предупреждение не выдаётся; пользователь должен убедиться, что target содержит корректные распределения вероятностей. Передача произвольных значений может привести к вводящим в заблуждение значениям потерь и нестабильным градиентам во время обучения.

Примеры

>>> # Example of target with incorrectly specified class probabilities
>>> loss = nn.CrossEntropyLoss()
>>> torch.manual_seed(283)
>>> input = torch.randn(3, 5, requires_grad=True)
>>> target = torch.randn(3, 5)
>>> # Provided target class probabilities are not in range [0,1]
>>> target
tensor([[ 0.7105,  0.4446,  2.0297,  0.2671, -0.6075],
        [-1.0496, -0.2753, -0.3586,  0.9270,  1.0027],
        [ 0.7551,  0.1003,  1.3468, -0.3581, -0.9569]])
>>> # Provided target class probabilities do not sum to 1
>>> target.sum(axis=1)
tensor([2.8444, 0.2462, 0.8873])
>>> # No error message and possible misleading loss value
>>> loss(input, target).item()
4.6379876136779785
>>>
>>> # Example of target with correctly specified class probabilities
>>> # Use .softmax() to ensure true probability distribution
>>> target_new = target.softmax(dim=1)
>>> # New target class probabilities all in range [0,1]
>>> target_new
tensor([[0.1559, 0.1195, 0.5830, 0.1000, 0.0417],
        [0.0496, 0.1075, 0.0990, 0.3579, 0.3860],
        [0.2607, 0.1355, 0.4711, 0.0856, 0.0471]])
>>> # New target class probabilities sum to 1
>>> target_new.sum(axis=1)
tensor([1.0000, 1.0000, 1.0000])
>>> loss(input, target_new).item()
2.55349063873291
forward(input, target) [source]

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

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

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.CrossEntropyLoss.html

Spec-Zone.ru

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