为 LSTM 二元分类构建语音数据集

Building Speech Dataset for LSTM binary classification

我正在尝试使用 theano 进行二元 LSTM 分类。 我已经阅读了示例代码,但是我想构建自己的代码。

我有一小部分 "Hello" & "Goodbye" 正在使用的录音。我通过为它们提取 MFCC 特征并将这些特征保存在文本文件中来预处理它们。我有 20 个语音文件(每个 10 个),我正在为每个单词生成一个文本文件,因此 20 个包含 MFCC 功能的文本文件。每个文件都是一个 13x56 矩阵。

我现在的问题是:如何使用这个文本文件来训练 LSTM?

我对此比较陌生。我也浏览了一些关于它的文献,但没有找到对这个概念的真正理解。

也欢迎使用 LSTM 的任何更简单的方法。

例如Tensorflow Implementation, Kaldi-focused implementation with all the scripts有很多现有的实现,最好先检查一下。

Theano 太low-level,你可以试试keras instead, as described in tutorial。您可以 运行 教程 "as is" 了解事情的进展。

然后,您需要准备一个数据集。您需要将数据转换为数据帧序列,并且需要为序列中的每个数据帧分配一个输出标签。

Keras 支持两种类型的 RNN - 返回序列的层和返回简单值的层。您可以对两者进行试验,在您只使用 return_sequences=Truereturn_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 并训练你的模型。您可以在训练后评估保留集上的模型质量。

因为你只有 20 个例子,你会遇到收敛问题。您需要更多示例,最好是数千个来训练 LSTM,您将只能使用非常小的模型。