现有的实现有很多,例如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
并训练你的模型。您可以在训练后估计保持集上的模型质量。
由于您只有 20 个示例,因此您将遇到收敛问题。你需要更多的例子,最好是数千个来训练 LSTM,你只能使用非常小的模型。