我正在尝试使用theano进行二进制LSTM分类。我已经完成了示例代码,但是我想构建自己的代码。
我有一小套"你好"&我正在使用的"再见"录音。我通过提取它们的MFCC特征并将这些特征保存在文本文件中来对它们进行预处理。我有20个语音文件(每个10个),我为每个单词生成一个文本文件,因此有20个文本文件包含MFCC功能。每个文件都是一个13x56矩阵。
我现在的问题是:如何使用这个文本文件来训练LSTM?
我对此还比较陌生。我也查阅了一些关于它的文献,但没有发现对这个概念有很好的理解。
任何使用LSTM的更简单的方法也将受到欢迎。
有很多现有的实现,例如Tensorflow实现,所有脚本都以Kaldi为中心的实现,最好先检查一下。
Theano太低级了,您可以尝试使用keras,如教程中所述。您可以按原样运行教程来了解事情的进展。
然后,您需要准备一个数据集。您需要将数据转换为数据帧序列,并且需要为序列中的每个数据帧分配一个输出标签。
Keras支持两种类型的RNN——返回序列的层和返回简单值的层。您可以同时尝试这两种方法,在代码中只需使用return_sequences=True
或return_sequences=False
要使用序列进行训练,您可以为所有帧指定伪标签,但可以为要识别的单词指定标签的最后一帧除外。您需要将输入和输出标签放置到数组中。因此:
X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]]
Y = [[0,0,...,1], [0,0,....,2]]
在X中,每个元素都是一个13个浮点的向量。在Y中,每个元素只是一个数字-0表示中间帧,单词ID表示最终帧。
要只使用标签进行训练,您需要将输入和输出标签放置到数组中,而输出数组更简单。因此数据将是:
X = [[word1frame1, word1frame2, ..., word1framen],[word2frame1, word2frame2,...word2framen]]
Y = [[0,0,1], [0,1,0]]
请注意,输出是矢量化的(np_utils.to_categorical),以将其转换为矢量,而不仅仅是数字。
然后创建网络体系结构。您可以有13个浮点用于输入,一个向量用于输出。在中间可能有一个完全连接的层,然后是一个lstm层。不要用太大的层,从小的层开始。
然后将这个数据集输入到model.fit
中,它将训练您的模型。训练后,可以在heldout集上估计模型质量。
由于只有20个例子,所以收敛性会有问题。你需要更多的例子,最好是数千个来训练LSTM,你只能使用非常小的模型。