我想对音素概率值矩阵(给出的 ASR 模型的输出)执行 CTC Beam Search。Tensorflow 有一个 CTC Beam Search实现,但它的文档记录很差,我没有给出一个有效的例子。我想编写一个代码以将其用作基准。
到目前为止,这是我的代码:
import numpy as np
import tensorflow as tf
def decode_ctcBeam(matrix, classes):
matrix = np.reshape(matrix, (matrix.shape[0], 1,matrix.shape[1]))
aa_ctc_blank_aa_logits = tf.constant(matrix)
sequence_length = tf.constant(np.array([len(matrix)], dtype=np.int32))
(decoded_list,), log_probabilities = tf.nn.ctc_beam_search_decoder(inputs=aa_ctc_blank_aa_logits,
sequence_length=sequence_length,
merge_repeated=True,
beam_width=25)
out = list(tf.Session().run(tf.sparse_tensor_to_dense(decoded_list)[0]))
print(out)
return out
if __name__ == '__main__':
classes = ['AA', 'B', 'CH']
mat = np.array([[0.4, 0, 0.6, 0.2], [0.4, 0, 0.6, 0.2]], dtype=np.float32)
actual = decode_ctcBeam (mat, classes)
我在理解代码时遇到问题:
- 在示例中,垫子的形状为 (2, 4),但 tensorflow 模块需要 (2, 1, 4) 形状,所以我用它重塑垫子,
matrix = np.reshape(matrix, (matrix.shape[0], 1,matrix.shape[1]))
但这在数学上意味着什么?垫子和矩阵是一样的吗?还是我在这里混在一起?中间的 1 是我理解的批量大小。 - decode_ctcBeam函数返回一个列表,在它给出的示例中 [2],这应该意味着来自已定义类的“CH” 。如果我有一个更大的输入矩阵,比如说 40 个音素,我该如何概括这一点并找到识别的音素序列?
期待您的回答/评论!谢谢!