如何设计tensorflow的ctc loss layer的label
How to design the label for tensorflow's ctc loss layer
我刚开始在 tensorflow(r1.0) 中使用 ctc 损失层,对 "labels" 输入有点困惑
在tensorflow的API文档中,它说
labels: An int32 SparseTensor. labels.indices[i, :] == [b, t] means labels.values[i] stores the id for (batch b, time t). labels.values[i] must take on values in [0, num_labels)
- [b,t] 和 values[i] 是否表示批次中序列 "b" 的 "t" 处有标签 "values[i]"?
- 它说值必须在[0,num_labels), 但是对于稀疏张量,除了一些特定的地方几乎所有地方都是0,所以我真的不知道稀疏张量应该如何ctc 就像
- 例如,如果我有一个手势的短视频,它有一个标签“1”,我应该将所有时间步长的输出标记为“1”,还是只将最后一个时间步长标记为“1” " 并取其他为 "blank"?
谢谢!
解决您的问题:
1. 这里文档中的符号似乎有点误导,因为输出标签索引 t
不需要与输入时间片相同,它只是输出序列的索引。可以使用不同的字母,因为输入和输出序列未明确对齐。否则,您的断言似乎是正确的。下面我举个例子。
零是序列输出标签中的有效 class。 TensorFlow 的 CTC 实现中所谓的空白标签是最后一个(最大的)class,它无论如何都不应该出现在你的真实标签中。因此,如果您正在编写一个二进制序列 classifier,您将拥有三个 classes,0(比如 "off")、1("on")和 2("blank" CTC的输出)。
CTC Loss 用于标记序列输入和 sequence 输出。如果你只有
序列输入的单个 class 标签输出,您最好在 RNN 单元的最后一个时间步长的输出上使用 softmax 交叉熵损失。
如果您最终使用了 CTC 损失,您可以在此处查看我如何通过 reader 构建训练序列: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]))
注意稀疏张量值中索引的行如何对应于批号,列如何对应于该特定标签的序列索引。这些值本身是序列标签 classes。秩为 2,最后一个维度的大小(在本例中为 9)是最长序列的长度。
我刚开始在 tensorflow(r1.0) 中使用 ctc 损失层,对 "labels" 输入有点困惑
在tensorflow的API文档中,它说
labels: An int32 SparseTensor. labels.indices[i, :] == [b, t] means labels.values[i] stores the id for (batch b, time t). labels.values[i] must take on values in [0, num_labels)
- [b,t] 和 values[i] 是否表示批次中序列 "b" 的 "t" 处有标签 "values[i]"?
- 它说值必须在[0,num_labels), 但是对于稀疏张量,除了一些特定的地方几乎所有地方都是0,所以我真的不知道稀疏张量应该如何ctc 就像
- 例如,如果我有一个手势的短视频,它有一个标签“1”,我应该将所有时间步长的输出标记为“1”,还是只将最后一个时间步长标记为“1” " 并取其他为 "blank"?
谢谢!
解决您的问题:
1. 这里文档中的符号似乎有点误导,因为输出标签索引 t
不需要与输入时间片相同,它只是输出序列的索引。可以使用不同的字母,因为输入和输出序列未明确对齐。否则,您的断言似乎是正确的。下面我举个例子。
零是序列输出标签中的有效 class。 TensorFlow 的 CTC 实现中所谓的空白标签是最后一个(最大的)class,它无论如何都不应该出现在你的真实标签中。因此,如果您正在编写一个二进制序列 classifier,您将拥有三个 classes,0(比如 "off")、1("on")和 2("blank" CTC的输出)。
CTC Loss 用于标记序列输入和 sequence 输出。如果你只有 序列输入的单个 class 标签输出,您最好在 RNN 单元的最后一个时间步长的输出上使用 softmax 交叉熵损失。
如果您最终使用了 CTC 损失,您可以在此处查看我如何通过 reader 构建训练序列: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]))
注意稀疏张量值中索引的行如何对应于批号,列如何对应于该特定标签的序列索引。这些值本身是序列标签 classes。秩为 2,最后一个维度的大小(在本例中为 9)是最长序列的长度。