如何将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 数组,有关详细信息,请参阅文档。
我正在构建手写识别模型,目前验证准确率为 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 数组,有关详细信息,请参阅文档。