CTCLoss
-
class torch.nn.modules.loss.CTCLoss(blank=0, reduction='mean', zero_infinity=False)[источник] -
Функция потерь Connectionist Temporal Classification.
Вычисляет функцию потерь между непрерывным (неразмеченным) временным рядом и целевой последовательностью. CTCLoss суммирует вероятности возможных выравниваний входных данных с целевыми, получая значение функции потерь, дифференцируемое по каждому входному узлу. Предполагается, что выравнивание входных данных с целевыми является «многие-к-одному», что ограничивает длину целевой последовательности: она должна быть длины входных данных.
- Параметры:
-
- blank (int, необязательно) – метка blank. По умолчанию .
-
reduction (str, необязательно) – задаёт способ редукции выходных данных:
'none'|'mean'|'sum'.'none': редукция не применяется,'mean': значения функции потерь делятся на длины целевых последовательностей, после чего вычисляется среднее по пакету,'sum': значения функции потерь суммируются. По умолчанию:'mean' -
zero_infinity (bool, необязательно) – следует ли заменять бесконечные значения функции потерь и связанные с ними градиенты нулями. По умолчанию:
False. Бесконечные значения функции потерь возникают главным образом, когда входные данные слишком короткие для выравнивания с целевыми.
- Форма:
-
- Log_probs: тензор размера или , где , , а . Логарифмированные вероятности выходных данных (например, полученные с помощью
torch.nn.functional.log_softmax()). - Targets: тензор размера или , где , а . Представляет целевые последовательности. Каждый элемент целевой последовательности — это индекс класса. Индекс целевого класса не может быть равен blank (по умолчанию=0). В форме целевые последовательности дополняются до длины самой длинной последовательности и объединяются в пакет. В форме предполагается, что целевые последовательности не дополнены и объединены в одномерный тензор.
- Input_lengths: кортеж или тензор размера или , где . Представляет длины входных последовательностей (каждая должна быть ). Длины указываются для каждой последовательности, чтобы обеспечить маскирование при условии, что последовательности дополнены до одинаковой длины.
- Target_lengths: кортеж или тензор размера или , где . Представляет длины целевых последовательностей. Длины указываются для каждой последовательности, чтобы обеспечить маскирование при условии, что последовательности дополнены до одинаковой длины. Если форма целевого тензора равна , target_lengths фактически задают индекс остановки для каждой целевой последовательности, так что
target_n = targets[n,0:s_n]для каждой цели в пакете. Каждая длина должна быть . Если целевые последовательности переданы в виде одномерного тензора, объединяющего отдельные цели, сумма значений target_lengths должна равняться общей длине тензора. - Output: скаляр, если
reductionравно'mean'(по умолчанию) или'sum'. Еслиreductionравно'none', результат имеет форму для пакетного ввода или для ввода без пакета, где .
- Log_probs: тензор размера или , где , , а . Логарифмированные вероятности выходных данных (например, полученные с помощью
Примеры
>>> # Target are to be padded >>> T = 50 # Input sequence length >>> C = 20 # Number of classes (including blank) >>> N = 16 # Batch size >>> S = 30 # Target sequence length of longest target in batch (padding length) >>> S_min = 10 # Minimum target length, for demonstration purposes >>> >>> # Initialize random batch of input vectors, for *size = (T,N,C) >>> input = torch.randn(T, N, C).log_softmax(2).detach().requires_grad_() >>> >>> # Initialize random batch of targets (0 = blank, 1:C = classes) >>> target = torch.randint(low=1, high=C, size=(N, S), dtype=torch.long) >>> >>> input_lengths = torch.full(size=(N,), fill_value=T, dtype=torch.long) >>> target_lengths = torch.randint( ... low=S_min, ... high=S, ... size=(N,), ... dtype=torch.long, ... ) >>> ctc_loss = nn.CTCLoss() >>> loss = ctc_loss(input, target, input_lengths, target_lengths) >>> loss.backward() >>> >>> >>> # Target are to be un-padded >>> T = 50 # Input sequence length >>> C = 20 # Number of classes (including blank) >>> N = 16 # Batch size >>> >>> # Initialize random batch of input vectors, for *size = (T,N,C) >>> input = torch.randn(T, N, C).log_softmax(2).detach().requires_grad_() >>> input_lengths = torch.full(size=(N,), fill_value=T, dtype=torch.long) >>> >>> # Initialize random batch of targets (0 = blank, 1:C = classes) >>> target_lengths = torch.randint(low=1, high=T, size=(N,), dtype=torch.long) >>> target = torch.randint( ... low=1, ... high=C, ... size=(sum(target_lengths),), ... dtype=torch.long, ... ) >>> ctc_loss = nn.CTCLoss() >>> loss = ctc_loss(input, target, input_lengths, target_lengths) >>> loss.backward() >>> >>> >>> # Target are to be un-padded and unbatched (effectively N=1) >>> T = 50 # Input sequence length >>> C = 20 # Number of classes (including blank) >>> >>> # Initialize random batch of input vectors, for *size = (T,C) >>> input = torch.randn(T, C).log_softmax(1).detach().requires_grad_() >>> input_lengths = torch.tensor(T, dtype=torch.long) >>> >>> # Initialize random batch of targets (0 = blank, 1:C = classes) >>> target_lengths = torch.randint(low=1, high=T, size=(), dtype=torch.long) >>> target = torch.randint( ... low=1, ... high=C, ... size=(target_lengths,), ... dtype=torch.long, ... ) >>> ctc_loss = nn.CTCLoss() >>> loss = ctc_loss(input, target, input_lengths, target_lengths) >>> loss.backward()
- Ссылка:
-
A. Graves и др.: Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks: https://www.cs.toronto.edu/~graves/icml_2006.pdf
Примечание
Для использования CuDNN необходимо выполнить следующие условия:
targetsдолжен иметь объединённый формат, всеinput_lengthsдолжны бытьT. ,target_lengths, аргументы-целые числа должны иметь типtorch.int32, а самlog_probsдолжен иметь типtorch.float32.В стандартной реализации используется тип
torch.long(более распространённый в PyTorch).Примечание
В некоторых случаях при использовании бэкенда CUDA с CuDNN этот оператор может выбирать недетерминированный алгоритм для повышения производительности. Если это нежелательно, можно попробовать сделать операцию детерминированной (возможно, ценой снижения производительности), задав
torch.backends.cudnn.deterministic = True. Дополнительную информацию см. в примечаниях о воспроизводимости.-
forward(log_probs, targets, input_lengths, target_lengths)[источник] -
Выполняет прямой проход.
- Тип возвращаемого значения:
© 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.CTCLoss.html