rnnt_loss

paddle.nn.functional. rnnt_loss ( input, label, input_lengths, label_lengths, blank=0, fastemit_lambda=0.001, reduction='mean', name=None ) [源代码]

计算 RNNT loss。该接口的底层调用了第三方 [warp-transducer](https://github.com/b-flo/warp-transducer.git) 的实现。 也可以叫做 softmax with RNNT,因为 warp-transducer 库中插入了 softmax 激活函数来对输入的值进行归一化。

参数

  • input (Tensor) - 带填充的 logprobs 序列,是一个四维张量。张量形状为 [B, Tmax, Umax, D],其中 Tmax 为输入 logit 序列的最长长度。数据类型应该是 float32 或 float64。

  • label (Tensor) - 带填充的基本真值序列,它必须是一个二维张量。张量形状为 [B, Umax],其中 Umax 为标签序列的最长长度。数据类型必须为 int32。

  • input_lengths (Tensor) - 每个输入序列的长度,它应该有形状 [batch_size] 和 dtype int64。

  • label_lengths (Tensor) - 每个标签序列的长度,它应该有形状 [batch_size] 和 dtype int64。

  • blank (int,可选) - RNN-T loss 的空白标签索引,处于半开放区间 [0,B)。数据类型必须为 int32。默认值为 0。

  • fastemit_lambda (float,默认 0.001) - FastEmit 的正则化参数(https://arxiv.org/pdf/2010.11148.pdf)。

  • reduction (str,可选) - 表示如何平均损失,候选是 'none'``|'mean'|'sum'`` 。如果 :reduction'mean',输出将是损失的总和并除以 batch_size;如果 reduction'sum',返回损失的总和;如果 reduction'none',则不应用 reduction。默认是 'mean'

  • name (str,可选) - 操作名称,默认为 None。

返回

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

代码示例

# declarative mode
import paddle.nn.functional as F
import numpy as np
import paddle
import functools

fn = functools.partial(F.rnnt_loss, reduction='sum', fastemit_lambda=0.0, blank=0)

acts = np.array([[[[0.1, 0.6, 0.1, 0.1, 0.1],
                [0.1, 0.1, 0.6, 0.1, 0.1],
                [0.1, 0.1, 0.2, 0.8, 0.1]],
                [[0.1, 0.6, 0.1, 0.1, 0.1],
                [0.1, 0.1, 0.2, 0.1, 0.1],
                [0.7, 0.1, 0.2, 0.1, 0.1]]]])
labels = [[1, 2]]

acts = paddle.to_tensor(acts, stop_gradient=False)

lengths = [acts.shape[1]] * acts.shape[0]
label_lengths = [len(l) for l in labels]
labels = paddle.to_tensor(labels, paddle.int32)
lengths = paddle.to_tensor(lengths, paddle.int32)
label_lengths = paddle.to_tensor(label_lengths, paddle.int32)

costs = fn(acts, labels, lengths, label_lengths)
print(costs)
# Tensor(shape=[], dtype=float64, place=Place(gpu:0), stop_gradient=False,
#        4.49566677)