如何修改网络的联结时间分类 (CTC) 层也能给我们一个置信度分数?

How to modify the connectionist Temporal Classification (CTC) layer of the network to also give us a confidence score?

我正在尝试通过训练 CRNN(CNN+LSTM+CTC) 模型从单词本身的裁剪图像中识别单词。我很困惑如何添加置信度分数以及已识别的单词。我正在使用 tensorflow 并遵循 https://github.com/TJCVRS/CRNN_Tensorflow 的实现。有人可以建议我如何修改网络的连接主义时间分类 (CTC) 层,以便也给我们一个置信度分数吗?

目前我能想到的解决方案有两种:

  1. 两个 TensorFlow 解码器都提供有关已识别文本分数的信息。 ctc_greedy_decoder returns neg_sum_logits 其中包含每个批次元素的分数。 ctc_beam_search_decoder 也是如此,其中 returns log_probabilities 包含每个批次元素的每个光束的分数。
  2. 从两个解码器中的任何一个中取出识别的文本。将另一个 CTC 损失函数放入您的代码中,并将 RNN 输出矩阵和识别的文本输入损失函数。结果将是在矩阵中看到给定文本的概率(好吧,你必须撤消减号和对数,但这应该很容易)。

解决方案 (1) 实施起来更快且更简单,但是,解决方案 (2) 更准确。但是只要CRNN训练好,beam search decoder的beam width足够大,差别应该不会太大。

查看以下行中的 TF-CRNN 代码 - 分数已作为变量返回 log_prob:https://github.com/MaybeShewill-CV/CRNN_Tensorflow/blob/master/tools/train_shadownet.py#L62

这里是一个独立的代码示例,它说明了解决方案 (2): https://gist.github.com/githubharald/8b6f3d489fc014b0faccbae8542060dc

我自己的一个更新:

我最终通过将预测标签传回 ctc 损失函数并取所产生损失的负值的反对数来获得分数。我发现这个值比取 log_prob 的反对数非常准确。