现有的实现有很多,例如Tensorflow Implementation,Kaldi-focused implementation with all the scripts,最好先检查一下。
Theano 太低级,您可以尝试使用keras,如tutorial 中所述。您可以“按原样”运行教程以了解情况。
然后,您需要准备一个数据集。您需要将数据转换为数据帧序列,并且您需要为序列中的每个数据帧分配一个输出标签。
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,它会训练您的模型。您可以在训练后估计保持集上的模型质量。
因为您只有 20 个示例,所以您会遇到收敛问题。你需要更多的例子,最好是数千个来训练 LSTM,你只能使用非常小的模型。