ctc_loss

paddle.nn.functional.ctc_loss ( log_probs, labels, input_lengths, label_lengths, blank=0, reduction=’mean’ ) [源代码]

该接口用于计算 CTC loss。该接口的底层调用了第三方 baidu-research::warp-ctc 的实现。 也可以叫做 softmax with CTC,因为 Warp-CTC 库中插入了 softmax 激活函数来对输入的值进行归一化。

参数

  • log_probs (Tensor): - 经过 padding 的概率序列,其 shape 必须是 [max_logit_length, batch_size, num_classes + 1]。其中 max_logit_length 是最长输入序列的长度。该输入不需要经过 softmax 操作,因为该 OP 的内部对 input 做了 softmax 操作。数据类型仅支持float32。

  • labels (Tensor): - 经过 padding 的标签序列,其 shape 为 [batch_size, max_label_length],其中 max_label_length 是最长的 label 序列的长度。数据类型支持int32。

  • input_lengths (Tensor): - 表示输入 log_probs 数据中每个序列的长度,shape为 [batch_size] 。数据类型支持int64。

  • label_lengths (Tensor): - 表示 label 中每个序列的长度,shape为 [batch_size] 。数据类型支持int64。

  • blank (int,可选): - 空格标记的 ID 值,其取值范围为 [0,num_classes+1) 。数据类型支持int32。默认值为0。

  • reduction (string,可选): - 指定应用于输出结果的计算方式,可选值有: 'none', 'mean', 'sum'。设置为 'mean' 时,对 loss 值除以 label_lengths,并返回所得商的均值;设置为 'sum' 时,返回 loss 值的总和;设置为 'none' 时,则直接返回输出的 loss 值。默认值为 'mean'

返回

Tensor,输入 log_probs 和标签 labels 间的 ctc loss。如果 reduction'none', 则输出 loss 的维度为 [batch_size]。如果 reduction'mean''sum',则输出Loss的维度为 [1]。数据类型与输入 log_probs 一致。

代码示例

  1. # declarative mode
  2. import paddle.nn.functional as F
  3. import numpy as np
  4. import paddle
  5. # length of the longest logit sequence
  6. max_seq_length = 4
  7. #length of the longest label sequence
  8. max_label_length = 3
  9. # number of logit sequences
  10. batch_size = 2
  11. # class num
  12. class_num = 3
  13. np.random.seed(1)
  14. log_probs = np.array([[[4.17021990e-01, 7.20324516e-01, 1.14374816e-04],
  15. [3.02332580e-01, 1.46755889e-01, 9.23385918e-02]],
  16. [[1.86260208e-01, 3.45560730e-01, 3.96767467e-01],
  17. [5.38816750e-01, 4.19194520e-01, 6.85219526e-01]],
  18. [[2.04452246e-01, 8.78117442e-01, 2.73875929e-02],
  19. [6.70467496e-01, 4.17304814e-01, 5.58689833e-01]],
  20. [[1.40386939e-01, 1.98101491e-01, 8.00744593e-01],
  21. [9.68261600e-01, 3.13424170e-01, 6.92322612e-01]],
  22. [[8.76389146e-01, 8.94606650e-01, 8.50442126e-02],
  23. [3.90547849e-02, 1.69830427e-01, 8.78142476e-01]]]).astype("float32")
  24. labels = np.array([[1, 2, 2],
  25. [1, 2, 2]]).astype("int32")
  26. input_lengths = np.array([5, 5]).astype("int64")
  27. label_lengths = np.array([3, 3]).astype("int64")
  28. log_probs = paddle.to_tensor(log_probs)
  29. labels = paddle.to_tensor(labels)
  30. input_lengths = paddle.to_tensor(input_lengths)
  31. label_lengths = paddle.to_tensor(label_lengths)
  32. loss = F.ctc_loss(log_probs, labels,
  33. input_lengths,
  34. label_lengths,
  35. blank=0,
  36. reduction='none')
  37. print(loss) #[3.9179852 2.9076521]
  38. loss = F.ctc_loss(log_probs, labels,
  39. input_lengths,
  40. label_lengths,
  41. blank=0,
  42. reduction='mean')
  43. print(loss) #[1.1376063]