2017-02-27 66 views
2

我只是用tensorflow(R1.0)CTC损耗层开始,有一个有点困惑的“标签”输入如何设计标签tensorflow的CTC损失层

在tensorflow的API文档,它说

labels:一个int32 SparseTensor。 labels.indices [i,:] == [b,t]表示labels.values [i]存储(批量b,时间t)的id。 labels.values [I]必须承担值在[0,num_labels)

  1. 是并[b,t]的和值[I]的意思是有一个标签 “的值[I]” 在 “t” 的序列“b”的批次?
  2. 它说价值必须在[0,num_labels),但对于一个稀疏张量,除了某些特定的地方,几乎到处都是0,所以我不知道应该如何使ctc的稀疏张量像
  3. 例如,如果我有一个简短的手势视频,并且它有一个标签“1”,我应该将所有时间步的输出标记为“1”,还是只将最后一个时间步标记为“1”,并将其他标记为“空白”?

谢谢!

回答

3

为了解决你的问题:
1.文档中的符号在这里似乎有点误导,作为输出标记指数t不一定是一样的输入时间片,它只是索引输出序列。可以使用不同的字母,因为输入和输出序列没有明确对齐。否则,你的断言似乎是正确的。我在下面举一个例子。

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

  2. CTC损失用于标记序列输入,序列输出。如果您只有 序列输入的单个类别标签输出,则最好在RNN单元的最后一个时间步的输出上使用softmax交叉熵损失。

如果你最终使用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,最后维度的大小(在这种情况下是9)是最长序列的长度。

+0

对于后期回复感到抱歉,所以“t”只是特定标签的顺序,无论相应输入序列的持续时间有多长? –

+0

我认为是对的。但是,尽管模型每个输入切片只能产生最多一个输出,但您的标签序列不应该长于输入长度。 (使用标签合并,它也可以生成_fewer_输出,而不是输入。) – Jerod