在TensorFlow(python)中为CTC Loss准备目标标签

时间:2016-11-24 06:34:11

标签: python tensorflow

我正准备一个用于手写识别的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]  

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

2 个答案:

答案 0 :(得分:0)

如果我正确理解了这一点,那么您使用的批量大小为3,并且将不同长度的目标组合在一起。 对于CTC损失,我建议使用一批1号,因为CTC似乎无法收敛长序列。

在密集的表示中,您似乎用0&#39s填充较短的目标。那些应该是3(而不是空白)。

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

答案 1 :(得分:0)

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

张量输入的最里面维度尺寸num_classes代表num_labels + 1类,其中num_labels是真实标签的数量,最大值(num_classes-1)保留用于空白标签。

labels:一个int32 SparseTensor。 labels.indices [i,:] == [b,t]表示labels.values [i]存储(批次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]。 Logits。

在创建ctcloss的第一个参数“标签”时,不应插入空白标签。每个值都必须在[0,numOfTrueLabels)范围内。在说明中清楚地给出了这一点。