【问题标题】:Preparing target label in TensorFlow (python) for CTC Loss在 TensorFlow (python) 中为 CTC 损失准备目标标签
【发布时间】:2017-04-08 08:22:31
【问题描述】:

我正在准备一个用于手写识别的 TensorFlow 应用程序。我使用的是一个简单的 RNN 模型,最后是堆叠的 LSTM 单元和 CTC 损失。我对为输入数据准备标签有些困惑。

假设我有三个字符串作为目标标签"abc""ab""baccc"(在我的情况下,目标标签是单词而不是句子)。所以我有三个字符类作为索引a:0, b:1, c:2, blank:3。据我了解,目标标签的密集表示应该是

0 3 1 3 2 0 0 0  
0 3 1 0 0 0 0 0  
1 3 0 2 3 2 3 2  

但由于 TensorFlow 需要此标签的稀疏表示,我需要准备一个稀疏表示为

indices[(0,0),(0,1),(0,2),(0,3),(0,4),(1,0),(1,1),(1,2),(2,0),(2,1),(2,2),(2,3),(2,4),(2,5),(2,6),(2,7)]  
values[0,3,1,3,2,0,3,1,1,3,0,2,3,2,3,2]  
shape[3,8]  

我对这个数据准备是否正确?非常感谢任何帮助。

【问题讨论】:

    标签: python tensorflow


    【解决方案1】:

    如果我理解正确的话,您使用的批量大小为 3,并且将不同长度的目标存储在一起。 对于 CTC 损失,我建议使用大小为 1 的批次,因为 CTC 似乎无法在长序列上收敛。

    在密集表示中,您似乎用 0 填充较短的目标。这些应该是 3(空白)。

    最后,您构建的稀疏张量对我来说似乎是正确的。你在维度上有问题吗?你有错误日志要显示吗?

    【讨论】:

    • 感谢您的回答。它有很大的帮助。我肯定会使用批量大小 1。但是关于目标标签,我实际上并没有准备密集矩阵。由于 tensorflow 需要我直接准备 Sparse。现在,如果 TF 用 0 填充它们(作为内部操作),我将无能为力。我可以吗 ?不过,您的反馈很有用。
    【解决方案2】:

    来自张量流网站:https://www.tensorflow.org/api_docs/python/tf/nn/ctc_loss

    输入Tensor的最内层维度大小num_classes,代表num_labels + 1个类,其中num_labels是真标签的个数,最大值(num_classes - 1)留给空白标签。

    标签:一个 int32 稀疏张量。 labels.indices[i, :] == [b, t] 表示 labels.values[i] 存储(batch b,时间 t)的 id。 labels.values[i] 必须采用 [0, num_labels) 中的值。

    输入:3-D 浮点张量。如果 time_major == False,这将是一个张量形状:[batch_size, max_time, num_classes]。如果 time_major == True(默认),这将是一个张量形状:[max_time, batch_size, num_classes]。日志。

    您不应在创建 ctcloss 的第一个参数“标签”时插入空白标签。每个值必须在 [0,numOfTrueLabels) 范围内。这在描述中明确给出。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-23
      • 1970-01-01
      • 2018-01-16
      • 2020-12-04
      • 1970-01-01
      • 2021-07-08
      • 2022-06-28
      • 1970-01-01
      相关资源
      最近更新 更多