如何将word beam search ctc实现到keras?

how to implement word beam search ctc to keras?

我正在构建手写识别模型,目前验证准确率为 88%。我看到了这个 github 页面,它可以帮助模型使用字典实现更准确的预测。

问题是我不知道如何在我当前的模型中实现它。这是我当前的 ctc 函数,它是从 a keras tutorial 复制的。我如何修改它以添加字典?

class CTCLayer(keras.layers.Layer):
    def __init__(self, name=None):
        super().__init__(name=name)
        self.loss_fn = keras.backend.ctc_batch_cost

    def call(self, y_true, y_pred):
        batch_len = tf.cast(tf.shape(y_true)[0], dtype="int64")
        input_length = tf.cast(tf.shape(y_pred)[1], dtype="int64")
        label_length = tf.cast(tf.shape(y_true)[1], dtype="int64")

        input_length = input_length * tf.ones(shape=(batch_len, 1), dtype="int64")
        label_length = label_length * tf.ones(shape=(batch_len, 1), dtype="int64")
        loss = self.loss_fn(y_true, y_pred, input_length, label_length)
        self.add_loss(loss)

        # At test time, just return the computed predictions.
        return y_pred

这是词束搜索在原 github 页面上的实现。具体来说,我的主要问题是从函数中获取损失。然后将损失返回给 ctc 层。


chars = ''.join(self.char_list)
word_chars = open('../model/wordCharList.txt').read().splitlines()[0]
corpus = open('../data/corpus.txt').read()

# decode using the "Words" mode of word beam search
from word_beam_search import WordBeamSearch
self.decoder = WordBeamSearch(50, 'Words', 0.0, corpus.encode('utf8'), chars.encode('utf8'),word_chars.encode('utf8'))

我尝试查看 github 在他们的项目中实现此功能的页面,但他们似乎使用的是 tensorflow v1,这让我有点困惑,因为我是该领域的初学者。如有任何回复,我们将不胜感激。

词束搜索只是一个解码器,不是损失函数。对于损失,您仍然使用 Keras 附带的“标准”CTC 损失。这意味着在您的训练代码中,您甚至不必考虑词束搜索。

词束搜索仅应用于推理。您所要做的就是将 Tensors 转换为 numpy 数组,有关详细信息,请参阅文档。