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

在TensorFlow(python)中为CTC丢失准备目标标签,python,tensorflow,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应用程序,用于手写识别。我使用的是一个简单的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]  

关于此数据准备,我是否正确?非常感谢您的帮助。

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

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

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

来自tensorflow网站:

输入张量的最内径尺寸,NUMYCYPE类,表示NUMYLAMP + 1类,其中NUMYLAMP是真实标签的数量,最大值(NUMQUEST类- 1)保留为空白标签。

标签:一个int32 SparseTensor。labels.index[i,:]=[b,t]表示标签。值[i]存储(批次b,时间t)的id。标签。值[i]必须采用[0,num_标签)中的值

输入:三维浮点张量。如果time\u major==False,这将是一个张量形状的:[批大小,max\u时间,num\u类]。如果time\u major==True(默认),这将是一个张量形状的:[max\u时间,batch\u大小,num\u类]。logits


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

谢谢你的回答。这非常有帮助。我肯定会使用批量1。但是关于目标标签,我没有实际准备致密矩阵。由于tensorflow的需要,我直接准备了稀疏矩阵。现在如果TF用0填充它们(作为内部操作)我什么都做不了。可以吗?不过,你的反馈很有用。