淘先锋技术网

首页 1 2 3 4 5 6 7

CTC loss

依据RNN网络的性质,每个时刻输出一个字符,RNN的最终输出是字符序列S ,需要后处理才能得到标签T 。在实际应用中,例如文字识别过程中,S 和T 的长度是变化的,且不是等长的,那么就需要一种算法来完成对齐操作。CTC算法能够自动地完成S 和T 对齐。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么用前向后向算法?

在隐马尔可夫HMM中,使用前向后向算法主要解决问题是:给定HMM模型λ,以及观测序列O,求输出观测序列概率P(O|λ)。使用直接计算法是不能计算出来的,计算量太大。
而这个就是面临的就是这个问题。使用前向后向算法能够很好的解决这个问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

	ctc_loss函数:
	tf.nn.ctc_loss( labels, logits, label_length, logit_length, logits_time_major=True, unique=None, blank_index=None, name=None )
	计算CTC(连接主义时间分类)损失。

notes:

  • 这个类将执行softmax操作,所以输入应该是例如 LSTM对输出的线性预测。
  • inputs:num_classes:num_labels+1个类, num_labels表示真实标签的数量,空白标签保留。
  • preprocess_collapse_repeated:如果它设置为True,在丢失计算之前预处理时,传递给损失的重复标签将合并为单个标签。(强制对齐,不必要的重复)
  • ctc_merge_repeated:如果设置为False,重复的非空白标签不会被合并,会解释为单个标签。
  • ignore_longer_outputs_than_inputs选项允许在处理输出长于输入的序列时指定CTCLoss的行为。 如果为true,则CTCLoss将仅为这些项返回零梯度,否则返回InvalidArgument错误,停止训练。

参数:

  • labels: 是一个 int32 类型的稀疏张量(SparseTensor), labels.indices[i, :] == [b, t] 表示 labels.values[i] 保存着(batch b, time t)的 id,labels.values[i] must take on values in [0, num_labels)
  • inputs: (常用变量 logits 表示)经过 RNN 后输出的标签预测值,是一个 3D 浮点 Tensor,当 time_major=True(默认)时形状为:(max_time * batch_size * num_classes),否则形状为:batch_size * max_time * num_classes,ctc_loss will perform the softmax operation for you
  • sequence_length: 1-D int32 vector, size 为 [batch_size],vector 中的每个值表示序列的长度,形如[max_time_step,…,max_time_step] ,此 sequence_length 和用在 dynamic_rnn 中的 sequence_length 是一致的, 用来表示 rnn 的哪些输出不是 pad 的.
  • preprocess_collapse_repeated: 是否需要预处理,将重复的 label 合并成一个,默认是 False
  • ctc_merge_repeated: 默认为 True

return :

  • A 1-D float Tensor, size [batch], containing the negative log probabilities,同样也需要对 ctc_loss 求均值。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
Tensorflow 函数

	tf.nn.ctc_greedy_decoder(
	inputs,
	sequence_length,
	merge_repeated=True
	)
			
	tf.nn.ctc_beam_search_decoder(
	inputs,
	sequence_length,
	beam_width=100,
	top_paths=1,
	merge_repeated=True
	)