我试图了解 CTC 损失如何用于语音识别以及如何在 Keras 中实现它。
- 我认为我理解的(如果我错了,请纠正我!)
总的来说,CTC 损失是在经典网络之上添加的,以便逐个元素地解码顺序信息(文本或语音的逐字母),而不是直接直接解码元素块(例如单词)。
假设我们将某些句子的话语作为 MFCC 提供。
使用 CTC-loss 的目标是学习如何使每个字母在每个时间步与 MFCC 匹配。因此,Dense+softmax 输出层由与组成句子所需的元素数量一样多的神经元组成:
- 字母 (a, b, ..., z)
- 空白标记 (-)
- 一个空格 (_) 和一个结束字符 (>)
然后,softmax 层有 29 个神经元(26 个用于字母表 + 一些特殊字符)。
为了实现它,我发现我可以做这样的事情:
# CTC implementation from Keras example found at https://github.com/keras-
# team/keras/blob/master/examples/image_ocr.py
def ctc_lambda_func(args):
y_pred, labels, input_length, label_length = args
# the 2 is critical here since the first couple outputs of the RNN
# tend to be garbage:
# print "y_pred_shape: ", y_pred.shape
y_pred = y_pred[:, 2:, :]
# print "y_pred_shape: ", y_pred.shape
return K.ctc_batch_cost(labels, y_pred, input_length, label_length)
input_data = Input(shape=(1000, 20))
#let's say each MFCC is (1000 timestamps x 20 features)
x = Bidirectional(lstm(...,return_sequences=True))(input_data)
x = Bidirectional(lstm(...,return_sequences=True))(x)
y_pred = TimeDistributed(Dense(units=ALPHABET_LENGTH, activation='softmax'))(x)
loss_out = Lambda(function=ctc_lambda_func, name='ctc', output_shape=(1,))(
[y_pred, y_true, input_length, label_length])
model = Model(inputs=[input_data, y_true, input_length,label_length],
outputs=loss_out)
使用 ALPHABET_LENGTH = 29(字母长度 + 特殊字符)
和:
- y_true : 包含真值标签的张量 (samples, max_string_length)。
- y_pred:张量(samples,time_steps,num_categories)包含预测或softmax的输出。
- input_length : 张量 (samples, 1) 包含 y_pred 中每个批次项目的序列长度。
- label_length:张量 (samples, 1) 包含 y_true 中每个批次项目的序列长度。
(来源)
现在,我面临一些问题:
- 我不明白的
- 这种植入是编码和使用 CTC 损失的正确方法吗?
- 我不明白y_true、input_length和 label_length具体是什么。有什么例子吗?
- 我应该以什么形式将标签提供给网络?再次,有什么例子吗?