我尝试使用CTC进行语音识别,并尝试了CTC示例here。在该示例中,CTC Lambda
层的输入是softmax层(y_pred
)的输出。 Lambda
图层调用ctc_batch_cost
内部调用Tensorflow的ctc_loss
,但Tensorflow ctc_loss
documentation表示ctc_loss
函数在内部执行softmax,因此您不需要&inner
#39;首先需要softmax你的输入。我认为正确的用法是将Lambda
传递给ctc_loss
图层,这样您只需在内部div
函数中应用softmax一次。我试过这个例子,但它确实有效。我应该遵循示例还是Tensorflow文档?
答案 0 :(得分:6)
您发布的代码中使用的损失与您链接的代码不同。代码中使用的损失是found here
keras代码在调用ctc_loss
之前执行一些预处理,使其适合所需的格式。除了要求输入不是softmax-ed之外,tensorflow的ctc_loss
还期望dims为NUM_TIME, BATCHSIZE, FEATURES
。 Keras的ctc_batch_cost
做了这两件事in this line.
它会使log()摆脱softmax缩放,并且它也会使dim混乱,使其形状正确。当我说摆脱softmax缩放时,它显然不会恢复原始张量,而是softmax(log(softmax(x))) = softmax(x)
。见下文:
def softmax(x):
"""Compute softmax values for each sets of scores in x."""
e_x = np.exp(x - np.max(x))
return e_x / e_x.sum()
x = [1,2,3]
y = softmax(x)
z = np.log(y) # z =/= x (obviously) BUT
yp = softmax(z) # yp = y #####