ctc_greedy_decoder

paddle.fluid.layers. ctc_greedy_decoder ( input, blank, name=None ) [源代码]

该OP用于贪婪策略解码序列,步骤如下:

  1. 获取输入中的每一行的最大值索引,也就是numpy.argmax(input, axis=0)。

  2. 对于step1结果中的每个序列,合并两个空格之间的重复部分并删除所有空格。

该API支持两种输入,LoDTensor和Tensor输入,不同输入的代码样例如下:

样例

  1. # for lod tensor input
  2. 已知:
  3. input.data = [[0.6, 0.1, 0.3, 0.1],
  4. [0.3, 0.2, 0.4, 0.1],
  5. [0.1, 0.5, 0.1, 0.3],
  6. [0.5, 0.1, 0.3, 0.1],
  7. [0.5, 0.1, 0.3, 0.1],
  8. [0.2, 0.2, 0.2, 0.4],
  9. [0.2, 0.2, 0.1, 0.5],
  10. [0.5, 0.1, 0.3, 0.1]]
  11. input.lod = [[4, 4]]
  12. 计算过程:
  13. 1. argmax的运算结果应用于输入的第一个序列,即 input.data[0:4]
  14. 则得出的结果为[[0], [2], [1], [0]]
  15. 2. 合并重复的索引值部分,删除空格,即为0的值。
  16. 则第一个输入序列对应的输出为:[[2], [1]]
  17. 最后
  18. output.data = [[2],
  19. [1],
  20. [3]]
  21. output.lod = [[2, 1]]
  22. # for tensor input
  23. input.data = [[[0.6, 0.1, 0.3, 0.1],
  24. [0.3, 0.2, 0.4, 0.1],
  25. [0.1, 0.5, 0.1, 0.3],
  26. [0.5, 0.1, 0.3, 0.1]],
  27. [[0.5, 0.1, 0.3, 0.1],
  28. [0.2, 0.2, 0.2, 0.4],
  29. [0.2, 0.2, 0.1, 0.5],
  30. [0.5, 0.1, 0.3, 0.1]]]
  31. input_length.data = [[4], [4]]
  32. input.shape = [2, 4, 4]
  33. step1: Apply argmax to first input sequence which is input.data[0:4]. Then we get:
  34. [[0], [2], [1], [0]], for input.data[4:8] is [[0], [3], [3], [0]], shape is [2,4,1]
  35. step2: Change the argmax result to use padding mode, then argmax result is
  36. [[0, 2, 1, 0], [0, 3, 3, 0]], shape is [2, 4], lod is [], input_length is [[4], [4]]
  37. step3: Apply ctc_align to padding argmax result, padding_value is 0
  38. Finally:
  39. output.data = [[2, 1, 0, 0],
  40. [3, 0, 0, 0]]
  41. output_length.data = [[2], [1]]

参数:

  • input (Variable) — 变长序列的概率, 在输入为LoDTensor情况下,它是具有LoD信息的二维LoDTensor。 形状为[Lp,num_classes +1],其中Lp是所有输入序列的长度之和,num_classes是真实的类数。 在输入为Tensor情况下,它是带有填充的3-D张量,其形状为[batch_size,N,num_classes +1]。 (不包括空白标签)。 数据类型可以是float32或float64。

  • blank (int) — Connectionist Temporal Classification (CTC) loss空白标签索引, 其数值属于半开区间[0,num_classes + 1)

  • name (str) — (str|None,可选) – 该参数供开发人员打印调试信息时使用,具体用法请参见 Name ,默认值为None

返回:对于输入为LoDTensor的情况,返回CTC贪婪解码器的结果,即2-D LoDTensor,形状为[Lp,1],数据类型为int64。 “ Lp”是所有输出序列长度的总和。 如果结果中的所有序列均为空,则结果LoDTensor将为[-1],其中LoD为[[]]。对于输入为Tensor的情况,返回一个元组,(output, output_length), 其中,output是一个形状为 [batch_size, N],类型为int64的Tensor。output_length是一个形状为[batch_size, 1],类型为int64的Tensor,表示Tensor输入下,每个输出序列的长度。

返回类型: Variable

代码示例

  1. # for lod mode
  2. import paddle.fluid as fluid
  3. x = fluid.data(name='x', shape=[None, 8], dtype='float32', lod_level=1)
  4. cost = fluid.layers.ctc_greedy_decoder(input=x, blank=0)
  5. # for padding mode
  6. x_pad = fluid.data(name='x_pad', shape=[10, 4, 8], dtype='float32')
  7. x_pad_len = fluid.data(name='x_pad_len', shape=[10, 1], dtype='int64')
  8. out, out_len = fluid.layers.ctc_greedy_decoder(input=x_pad, blank=0,
  9. input_length=x_pad_len)