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
)