Spec-Zone.ru › PyTorch 2.14

CTCLoss

class torch.nn.modules.loss.CTCLoss(blank=0, reduction='mean', zero_infinity=False) [источник]

Функция потерь Connectionist Temporal Classification.

Вычисляет функцию потерь между непрерывным (неразмеченным) временным рядом и целевой последовательностью. CTCLoss суммирует вероятности возможных выравниваний входных данных с целевыми, получая значение функции потерь, дифференцируемое по каждому входному узлу. Предполагается, что выравнивание входных данных с целевыми является «многие-к-одному», что ограничивает длину целевой последовательности: она должна быть ≤\leq длины входных данных.

Параметры:
  • blank (int, необязательно) – метка blank. По умолчанию 00.
  • reduction (str, необязательно) – задаёт способ редукции выходных данных: 'none' | 'mean' | 'sum'. 'none': редукция не применяется, 'mean': значения функции потерь делятся на длины целевых последовательностей, после чего вычисляется среднее по пакету, 'sum': значения функции потерь суммируются. По умолчанию: 'mean'
  • zero_infinity (bool, необязательно) – следует ли заменять бесконечные значения функции потерь и связанные с ними градиенты нулями. По умолчанию: False. Бесконечные значения функции потерь возникают главным образом, когда входные данные слишком короткие для выравнивания с целевыми.
Форма:
  • Log_probs: тензор размера (T,N,C)(T, N, C) или (T,C)(T, C), где T=длина входных данныхT = \text{input length}, N=размер пакетаN = \text{batch size}, а C=количество классов (включая blank)C = \text{number of classes (including blank)}. Логарифмированные вероятности выходных данных (например, полученные с помощью torch.nn.functional.log_softmax()).
  • Targets: тензор размера (N,S)(N, S) или (sum⁡(target_lengths))(\operatorname{sum}(\text{target\_lengths})), где N=размер пакетаN = \text{batch size}, а S=максимальная длина целевой последовательности, если размер равен (N,S)S = \text{max target length, if shape is } (N, S). Представляет целевые последовательности. Каждый элемент целевой последовательности — это индекс класса. Индекс целевого класса не может быть равен blank (по умолчанию=0). В форме (N,S)(N, S) целевые последовательности дополняются до длины самой длинной последовательности и объединяются в пакет. В форме (sum⁡(target_lengths))(\operatorname{sum}(\text{target\_lengths})) предполагается, что целевые последовательности не дополнены и объединены в одномерный тензор.
  • Input_lengths: кортеж или тензор размера (N)(N) или ()(), где N=размер пакетаN = \text{batch size}. Представляет длины входных последовательностей (каждая должна быть ≤T\leq T). Длины указываются для каждой последовательности, чтобы обеспечить маскирование при условии, что последовательности дополнены до одинаковой длины.
  • Target_lengths: кортеж или тензор размера (N)(N) или ()(), где N=размер пакетаN = \text{batch size}. Представляет длины целевых последовательностей. Длины указываются для каждой последовательности, чтобы обеспечить маскирование при условии, что последовательности дополнены до одинаковой длины. Если форма целевого тензора равна (N,S)(N,S), target_lengths фактически задают индекс остановки sns_n для каждой целевой последовательности, так что target_n = targets[n,0:s_n] для каждой цели в пакете. Каждая длина должна быть ≤S\leq S. Если целевые последовательности переданы в виде одномерного тензора, объединяющего отдельные цели, сумма значений target_lengths должна равняться общей длине тензора.
  • Output: скаляр, если reduction равно 'mean' (по умолчанию) или 'sum'. Если reduction равно 'none', результат имеет форму (N)(N) для пакетного ввода или ()() для ввода без пакета, где N=размер пакетаN = \text{batch size}.

Примеры

>>> # 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. blank=0blank=0, target_lengths ≤256\leq 256, аргументы-целые числа должны иметь тип torch.int32, а сам log_probs должен иметь тип torch.float32.

В стандартной реализации используется тип torch.long (более распространённый в PyTorch).

Примечание

В некоторых случаях при использовании бэкенда CUDA с CuDNN этот оператор может выбирать недетерминированный алгоритм для повышения производительности. Если это нежелательно, можно попробовать сделать операцию детерминированной (возможно, ценой снижения производительности), задав torch.backends.cudnn.deterministic = True. Дополнительную информацию см. в примечаниях о воспроизводимости.

forward(log_probs, targets, input_lengths, target_lengths) [источник]

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

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

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

Spec-Zone.ru

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