如何为tensorflow的ctc损耗层设计标签

时间:2017-02-27 14:21:42

标签: tensorflow recurrent-neural-network

我刚开始在tensorflow(r1.0)中使用ctc loss layer并且与“标签”输入有点混淆

在tensorflow的API文档中,它说

  

标签:int32 SparseTensor。 labels.indices [i,:] == [b,t]表示labels.values [i]存储(批处理b,时间t)的id。 labels.values [i]必须采用[0,num_labels)

中的值
  1. [b,t]和值[i]是否意味着批次中序列“b”的“t”处有一个“values [i]”标签?
  2. 它表示值必须在[0,num_labels]中,但是对于稀疏张量,对于某些指定的位置几乎所有地方都是0,所以我真的不知道ctc的稀疏张量应该如何像
  3. 例如,如果我有一个简短的手势视频,并且标签为“1”,我应该将所有时间步的输出标记为“1”,还是仅将最后一个时间步标记为“1”并且把其他作为“空白”?
  4. 谢谢!

1 个答案:

答案 0 :(得分:5)

解决您的问题:
1.此处文档中的符号似乎有点误导,因为输出标签索引t不必与输入时间片相同,它只是输出序列的索引。可以使用不同的字母,因为输入和输出序列未明确对齐。否则,你的断言似乎是正确的。我举一个例子。

  1. 零是序列输出标签中的有效类。 TensorFlow的CTC实现中所谓的空白标签是最后一个(最大的)类,无论如何它可能不应该在你的地面实况标签中。因此,如果您正在编写二进制序列分类器,您将有三个类,0(说“关”),1(“开”)和2(CTC的“空白”输出)。

  2. CTC Loss用于标记具有序列输出的序列输入。如果你只有 对于序列输入的单个类标签输出,您可能最好在RNN单元的最后一个步骤的输出上使用softmax交叉熵损失。

  3. 如果您最终使用CTC丢失,您可以在此处查看我是如何通过阅读器构建训练序列的:How to generate/read sparse sequence labels for CTC loss within Tensorflow?

    作为一个例子,在我批处理两个分别具有标签序列[44, 45, 26, 45, 46, 44, 30, 44][5, 8, 17, 4, 18, 19, 14, 17, 12]的示例之后,我通过评估(批处理的)SparseTensor获得以下结果:

    SparseTensorValue(indices=array([[0, 0],
           [0, 1],
           [0, 2],
           [0, 3],
           [0, 4],
           [0, 5],
           [0, 6],
           [0, 7],
           [1, 0],
           [1, 1],
           [1, 2],
           [1, 3],
           [1, 4],
           [1, 5],
           [1, 6],
           [1, 7],
           [1, 8]]), values=array([44, 45, 26, 45, 46, 44, 30, 44,  5,  8, 17,  4, 18, 19, 14, 17, 12], dtype=int32), dense_shape=array([2, 9]))
    

    注意稀疏张量值中的索引行如何与批号对应,列对应于该特定标签的序列索引。值本身是序列标签类。等级为2,最后一个维度的大小(在这种情况下为九)是最长序列的长度。