为什么不简单地将您自己的波束搜索解码器添加到模型中?
应该不会太难。
通过 CRNN 代码搜索找到line where decoding happens at the moment:
sim_preds = converter.decode(preds.data, preds_size.data, raw=False)
好的,看起来 preds.data 保存了神经网络的输出张量。
不要调用converter.decode(...),而是将此张量传递给波束搜索解码器。
你可以拿我的CTC beam search implementation。
调用 BeamSearch.ctcBeamSearch(...),传递一个已经应用了 softmax 的批处理元素(mat),传递一个包含所有字符的字符串(按照神经网络输出它们的顺序),并传递 None 用于语言模型(如果您愿意,您可以稍后添加它)。
矩阵 mat 的形状必须为 Tx(C+1),其中 T 是时间步数,C+1 是字符数加上空白。
空白被假定为最后一个条目,因此请注意它。
这是一个简约的例子:
mat = np.array([[0.4, 0, 0.6], [0.4, 0, 0.6]]) # TxC with T=2, C=3
classes = 'ab' # all chars in the order they appear in mat (without blank)
res = BeamSearch.ctcBeamSearch(mat, classes, None) # decode it
Here is another example 获取更真实的用例来解码真实文本识别系统的输出。