Tensorflow 克瑞斯CTC损耗输入
我正在尝试使用CTC来使用keras进行语音识别,并尝试了CTC示例。在该示例中,CTCTensorflow 克瑞斯CTC损耗输入,tensorflow,keras,Tensorflow,Keras,我正在尝试使用CTC来使用keras进行语音识别,并尝试了CTC示例。在该示例中,CTCLambda层的输入是softmax层的输出(y_pred)。Lambda层调用ctc\u batch\u cost,该层内部调用Tensorflow的ctc\u loss,但假设ctc\u loss函数在内部执行softmax,因此您不需要首先对输入进行softmax。我认为正确的用法是将internal传递到Lambda层,这样您只能在ctc\u loss函数内部应用softmax一次。我试过这个例子,它
Lambda
层的输入是softmax层的输出(y_pred
)。Lambda
层调用ctc\u batch\u cost
,该层内部调用Tensorflow的ctc\u loss
,但假设ctc\u loss
函数在内部执行softmax,因此您不需要首先对输入进行softmax。我认为正确的用法是将internal
传递到Lambda
层,这样您只能在ctc\u loss
函数内部应用softmax一次。我试过这个例子,它是有效的。我应该遵循示例还是Tensorflow文档 您发布的代码中使用的损失与您链接的代码不同。代码中使用的损失是
keras代码在调用ctc\u loss
之前会进行一些预处理,使其适合所需的格式。除了要求输入不为softmax-ed外,tensorflow的ctc\u损失
还要求DIM为NUM\u时间、批次大小、功能
。Keras的ctc\u批量成本
实现了这两项功能
它会执行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 #####
是的,但是
ctc\u批量成本
在内部调用tensorflow的ctc\u损失
。你是对的。我正在探索double softmax是否会与一次性应用有所不同。你找到结论了吗?没有。我目前正在转向全张量流实现,以支持灵活性和多GPU支持。但是如果你能和我分享你的探索结果那就太好了,这很有趣。嘿,我不知道你是否还在乎,但是我更新了上面的答案,这说明他们都是对的。啊,是的,除了轴交换,我对那条线没太在意。现在清楚了。谢谢你的预言