Spec-Zone.ru › PyTorch 2.14

CrossEntropyLoss

class torch.nn.modules.loss.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≥1K \geq 1 для случая 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,if reduction=‘mean’;∑n=1Nln,if 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,if reduction=‘mean’;∑n=1Nln,if 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, optional) – вручную задаваемый вес масштабирования для каждого класса. Если задан, должен быть тензором размера C.
  • size_average (bool, optional) – Устарел (см. reduction). По умолчанию потери усредняются по каждому элементу потерь в батче. Обратите внимание, что для некоторых функций потерь на один образец приходится несколько элементов. Если поле size_average установлено в False, вместо этого потери суммируются для каждого мини-батча. Игнорируется, если reduce равно False. Значение по умолчанию: True
  • ignore_index (int, optional) – задаёт целевое значение, которое игнорируется и не влияет на градиент входных данных. Если size_average равно True, потери усредняются по целевым значениям, которые не игнорируются. Обратите внимание, что ignore_index применим только в том случае, если целевые значения содержат индексы классов.
  • reduce (bool, optional) – Устарел (см. reduction). По умолчанию потери усредняются или суммируются по наблюдениям каждого мини-батча в зависимости от size_average. Если reduce равно False, вместо этого возвращает значение потерь для каждого элемента батча и игнорирует size_average. Значение по умолчанию: True
  • reduction (str, optional) – задаёт редукцию, применяемую к выходным данным: 'none' | 'mean' | 'sum'. 'none': редукция не применяется, 'mean': вычисляется среднее значение выходных данных с учётом весов, 'sum': выходные данные суммируются. Примечание: size_average и reduce постепенно выводятся из употребления; пока что указание любого из этих аргументов переопределит reduction. Значение по умолчанию: 'mean'
  • label_smoothing (float, optional) – число с плавающей запятой в диапазоне [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.modules.loss.CrossEntropyLoss.html

Spec-Zone.ru

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