Python 如何正确使用tensorflow ctc光束搜索?

Python 如何正确使用tensorflow ctc光束搜索?,python,tensorflow,beam-search,ctc,Python,Tensorflow,Beam Search,Ctc,我想对(给出音素概率值的ASR模型的输出)矩阵执行CTC波束搜索。 Tensorflow有一个CTC波束搜索,但它的文档记录很差,而且我也无法给出一个有效的例子。我想编写一段代码,将其用作基准测试 以下是我目前的代码: import numpy as np import tensorflow as tf def decode_ctcBeam(matrix, classes): matrix = np.reshape(matrix, (matrix.shape[0], 1,matri

我想对(给出音素概率值的ASR模型的输出)矩阵执行CTC波束搜索。 Tensorflow有一个CTC波束搜索,但它的文档记录很差,而且我也无法给出一个有效的例子。我想编写一段代码,将其用作基准测试

以下是我目前的代码:

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)
我在理解代码时遇到问题:

  • 在示例中,mat的形状为(2,4),但tensorflow模块需要(2,1,4)的形状,因此我使用
    matrix=np.重塑(矩阵,(矩阵.形状[0],1,矩阵.形状[1]))
    但这在数学上意味着什么?matmatrix是否相同?还是我把事情搞混了?中间的1是批次大小,我理解。
  • decode_ctcBeam函数返回一个列表,在它给出的示例中[2],它应该表示定义类中的“CH”。如果我有一个更大的输入矩阵,比如说40个音素,我该如何推广这一点并找到已识别的音素序列

期待您的回答/评论!谢谢

所以,自从我提出这个问题以来,我已经取得了一些进展,但仍然没有弄清楚如何正确使用Tensorflow的CTC波束搜索。可以看出,设置top_paths=1和beam_width=1确实会返回贪婪搜索在整数列表中的预期输出,这些整数可以轻松转换为存储在类中所需的音素。这种情况下的输出为:

-------贪心的---------

输出整型列表

[1,22,39,14,32,8]

['AE','N','G','UH','D']

在波束搜索的情况下,结果很糟糕

-------波束搜索----------

输出整型列表

[26,19,9,28,5,0,2,31,1,22,39,14,32,20,8,16,39,30,37,8]

[p',K',DH',S',AY',AA',AH',TH',AE',N',G',UH',L',D',IH',T',Z',D']

参考是“我很好”。[1,22,39,14,32,8]的列表在Beam搜索结果中,其他部分应该是可选根?我很怀疑。 有人有什么想法吗

import numpy as np
import tensorflow as tf
import Classes

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,
                                              top_paths=1,
                                              beam_width=4)

    out = list(tf.Session().run(tf.sparse_tensor_to_dense(decoded_list)[0]))
    print("Output int list")
    print(out)
    seq_list = get_seq_from_list(out, classes)
    return seq_list
        
def decode_ctcgreedy(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,
                                              top_paths=1,
                                              beam_width=1)

    out = list(tf.Session().run(tf.sparse_tensor_to_dense(decoded_list)[0]))
    print("Output int list")
    print(out)
    seq_list = get_seq_from_list(out, classes)
    
    return seq_list

def get_seq_from_list(int_list, classes):
    out_list = []
    for i in range(0, len(int_list)):        
        out_list.append(classes[int_list[i]])
        
    return out_list

if __name__ == '__main__':

    mat = np.load('../npy_files/a1003.npy')
    classes = Classes.get_classes()
    
    print("-------Greedy---------")
    actual = decode_ctcgreedy(mat, classes)
    print(actual)    
    
    print("\n-------Beam Search----------")
    actual = decode_ctcBeam(mat, classes)
    print(actual)    

TF文档错误-波束宽度为1的波束搜索与贪婪解码(我创建了一个)不同

然后,您可以简单地使用np.transpose来重新排列维度,而不是np.reformate,然后使用np.expand_dims为批量大小1添加维度

最后,关于TF beam搜索实现:是的,文档不是很好。 我在文本识别模型中使用了该实现,我为您指出了与您相关的行:

  • :注意merge_repeated=False,因为TF的默认设置(为True)对99.99999%的相关用例没有意义。只需按照传递参数的变量名查看它们的外观,例如,输入矩阵是ctcIn3dTBC,它是RNN输出的转置版本
  • :该操作返回稀疏张量列表,必须将其解码为字符字符串

嘿,哈利!谢谢你伸出援手!我不知道波束宽度为1的波束搜索与贪婪解码不同。谢谢你帮我整理。我已经检查了关于这个问题的代码和文本识别实现,并用我自己的数据进行了beam搜索。然而,我仍然有与我的其他评论相同的问题。beam搜索的输出列表要长得多,对我来说没有意义。您能提供输入数据(保存的numpy array.npy)和来自类模块的类吗?这样我就可以运行脚本了?给你发了一封电子邮件!提前谢谢你!