mindspore.ops.CTCLoss
- class mindspore.ops.CTCLoss(preprocess_collapse_repeated=False, ctc_merge_repeated=True, ignore_longer_outputs_than_inputs=False)[源代码]
计算CTC(Connectionist Temporal Classification)损失和梯度。
该接口的底层调用了第三方baidu-research::warp-ctc的实现。CTC算法是在 Connectionist Temporal Classification: Labeling Unsegmented Sequence Data with Recurrent Neural Networks 中提出的。
CTCLoss计算连续时间序列和目标序列之间的损失。 CTCLoss对输入到目标的概率求和,产生一个损失值,该值相对于每个输入节点是可微的。 假设输入与目标的对齐是“多对一”的,这样目标序列的长度必须小于或等于输入的长度。
参数:
preprocess_collapse_repeated (bool) - 如果为True,在CTC计算之前将折叠重复标签。默认值:False。
ctc_merge_repeated (bool) - 如果为False,在CTC计算过程中,重复的非空白标签不会被合并,这些标签将被解释为单独的标签。这是CTC的简化版本。默认值:True。
ignore_longer_outputs_than_inputs (bool) - 如果为True,则输出比输入长的序列将被忽略。默认值:False。
输入:
x (Tensor) - 输入Tensor,其shape为 \((max\_time, batch\_size, num\_classes)\) 的三维Tensor。 num_classes 表示类别数,必须是 num_labels + 1 , num_labels 表示实际标签的数量。保留空白标签。默认空白标签为 num_classes - 1 。数据类型必须为float16、float32或float64。
labels_indices (Tensor) - 标签的索引。 labels_indices[i, :] = [b, t] 表示 labels_values[i] 存储 (batch b, time t) 的ID。数据类型必须为int64,秩必须为2。
labels_values (Tensor) - 一维Tensor。这些值与给定的batch size和时间相关联。数据类型必须为int32。 labels_values[i] 必须在 [0, num_classes) 的范围内。
sequence_length (Tensor) - 包含序列长度的Tensor,shape为 \((batch\_size,)\) 。数据类型必须为int32。Tensor中的每个值不得大于最大时间。
输出:
loss (Tensor) - 包含对数概率的Tensor,shape为 \((batch\_size, )\) 。Tensor的数据类型与 x 相同。
gradient (Tensor) - loss 的梯度,shape和数据类型与 x 相同。
异常:
TypeError - preprocess_collapse_repeated 、 ctc_merge_repeated 或 ignore_longer_outputs_than_inputs 不是bool。
TypeError - x 、 labels_indices 、 labels_values 或 sequence_length 不是Tensor。
ValueError - labels_indices 的秩不等于2。
TypeError - x 的数据类型不是float16、float32或float64。
TypeError - labels_indices 的数据类型不是int64。
TypeError - labels_values 或 sequence_length 的数据类型不是int32。
- 支持平台:
Ascend
GPU
CPU
样例:
>>> x = Tensor(np.array([[[0.3, 0.6, 0.6], ... [0.4, 0.3, 0.9]], ... ... [[0.9, 0.4, 0.2], ... [0.9, 0.9, 0.1]]]).astype(np.float32)) >>> labels_indices = Tensor(np.array([[0, 0], [1, 0]]), mindspore.int64) >>> labels_values = Tensor(np.array([2, 2]), mindspore.int32) >>> sequence_length = Tensor(np.array([2, 2]), mindspore.int32) >>> ctc_loss = ops.CTCLoss() >>> loss, gradient = ctc_loss(x, labels_indices, labels_values, sequence_length) >>> print(loss) [ 0.79628 0.5995158 ] >>> print(gradient) [[[ 0.27029088 0.36485454 -0.6351454 ] [ 0.28140804 0.25462854 -0.5360366 ]] [[ 0.47548494 0.2883962 0.04510255 ] [ 0.4082751 0.4082751 0.02843709 ]]]