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должен быть тензором размера для входных данных без пакета, или для случаяK-мерных данных. Последний вариант полезен для входных данных большей размерности, например, для вычисления потерь перекрёстной энтропии для каждого пикселя 2D-изображения.Ожидается, что
target, передаваемый этому критерию, будет содержать одно из следующего:-
Индексы классов в диапазоне , где — количество классов; если задан
ignore_index, эта функция потерь также принимает этот индекс класса (он не обязательно должен входить в диапазон индексов классов). Функцию потерь без редукции (то есть приreduction, равном'none') для этого случая можно описать следующим образом:где — входные данные, — целевые значения, — вес, — количество классов, а охватывает размерность пакета, а также для случая
K-мерных данных. Еслиreductionне равен'none'(по умолчанию'mean'), тоОбратите внимание, что этот вариант эквивалентен применению
LogSoftmaxк входным данным с последующим применениемNLLLoss. -
Вероятности для каждого класса; этот вариант полезен, когда требуются метки, охватывающие несколько классов для одного элемента пакета, например, при смешанных метках, сглаживании меток и т. д. Функцию потерь без редукции (то есть при
reduction, равном'none') для этого случая можно описать следующим образом:где — входные данные, — целевые значения, — вес, — количество классов, а охватывает размерность пакета, а также для случая
K-мерных данных. Еслиreductionне равен'none'(по умолчанию'mean'), то
Примечание
Производительность этого критерия обычно выше, когда
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 для компьютерного зрения. По умолчанию: .
-
weight (Tensor, необязательный) – задаваемый вручную вес масштабирования для каждого класса. Если задан, должен быть тензором размера
- Форма:
-
- Входные данные: форма , или , где для случая
K-мерной функции потерь. - Целевые значения: если содержат индексы классов, форма , или , где для случая K-мерной функции потерь, причём каждое значение должно находиться в диапазоне . При использовании индексов классов тип данных целевых значений должен быть long. Если целевые значения содержат вероятности классов, они должны иметь ту же форму, что и входные данные, а каждое значение должно находиться в диапазоне . Следовательно, при использовании вероятностей классов тип данных целевых значений должен быть float. Обратите внимание, что PyTorch строго не проверяет ограничения вероятностей для вероятностей классов; пользователь должен убедиться, что
targetсодержит корректные распределения вероятностей (подробности см. в разделе примеров ниже). - Выходные данные: если reduction равно ‘none’, форма — , или , где для случая K-мерной функции потерь; зависит от формы входных данных. В противном случае результат представляет собой скаляр.
где:
- Входные данные: форма , или , где для случая
Примеры
>>> # 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] -
Выполняет прямой проход.
- Тип возвращаемого значения:
-
© 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