使用 TensorFlow 进行端到端语音识别的 RNN
Posted
技术标签:
【中文标题】使用 TensorFlow 进行端到端语音识别的 RNN【英文标题】:RNN for End-End Speech Recognition using TensorFlow 【发布时间】:2016-11-18 00:36:37 【问题描述】:我在使用 TensorFlow 训练 RNN 处理语音到文本问题方面没有成功。我决定使用纯 FFT(即频谱图)作为训练数据来重现 Alex Graves, and Navdeep Jaitley, 2014 中描述的方法的结果,并编码了 3 层双向 RNN,每个 RNN 有 300 个 LSTM 单元。我想描述一下我从预处理音频信号到解码 logits 所遵循的步骤。
预处理:
使用 matplotlib.mlab 中的 specgram 函数将时域中的每个音频信号分割成 20ms 的帧,NFFT = (fs/1000 * 20 个样本) 长度,并以 7ms 的重叠执行加窗和 FFT .
我最初尝试计算功率谱ps |fft|^2
和10 * log10(ps)
的dB,但是TensorFlow CTC Loss 函数产生nan 值,并且优化器显然将所有参数更新为nan,因此我没有进一步使用这个。
值得一提的是,频谱图没有标准化,因为它只会使 TensorFlow 出于某种原因产生 nan 值。有人请澄清为什么会这样。我有一种感觉渐变正在消失。关于使用什么初始化范围的任何建议?
由于不同的音频文件的长度不同,我用 max_time 填充了每批的帧,因为这是形成形状为 [max_time,batch,NFFT]
的 mini-batch
所必需的。
由于所有的目标转录都是大写字母,我只在类列表中包含了 AZ、空格和一些标点符号(总共 32 个),用于将字符串目标转录转换为 SparseTensor。
RNN 配置:
前向和后向单元,每个 LSTM 单元在每层中使用 peephole 架构,每层有 300 个单元,最初将忘记偏差设置为 0 以查看性能。
将 project_size 设置为 hidden_size 500
的双向动态 RNN。
序列长度张量以最大时间长度为批处理中的每个数据适当分配值。
由于tf.nn.bidirectional_dynamic_rnn
不包括输出层sigmoid or softmax
,我在外部执行线性回归,其权重的形状为=[hidden_size,n_chars]
。
我使用了损失函数 tf.nn.ctc_loss
,它最初会返回 650 或 700 之类的巨大值,并在数百个 epoch 后下滑至最大值 500。
最后使用 CTC 波束搜索解码器从输出 softmax or sigmoid
层生成的 logits 中找到最佳路径。
现在,我不明白我哪里出错了,但我只是没有得到想要的转录(即,权重没有收敛以产生目标结果)。我要求有人澄清为什么会这样。我试图用 100 个音频剪辑过度拟合网络,但没有用。预测结果与预期的转录相去甚远。
感谢您的宝贵时间和支持。
【问题讨论】:
【参考方案1】:有很多参数可供使用。我发现具有高动量(大于0.99
)的momentum
优化器往往运行良好。其他人发现批处理会导致问题,因此应该使用较小的批处理大小。
无论哪种方式,这些模型的收敛都需要很长时间。
【讨论】:
我正在使用 mini-batch size: 100 并且总共有 47K 音频剪辑,我需要训练。在这种情况下,您会推荐多大的小批量? 您必须进行实验。有些人发誓你应该使用 batch_size 1,否则渐变会混淆。其他人使用更接近 64-128。通常,批量大小的 2 次方会导致计算速度稍快(但这与您的问题并不真正相关)。由于您没有大量数据,我建议您使用 Momentum 或 RMSProp 优化器,您可以在 0.9、0.95、0.99 之间改变动量参数,并尝试将 batch_sizes 设置为 1、8、64 和 128。【参考方案2】:如果你想试试这个,最好复制Eesen。
如果你仍然想要 tensorflow,你可以在 tensorflow CTC example 找到完整的。
【讨论】:
非常感谢您提供代码链接。我会马上调查的。【参考方案3】:您可以在https://github.com/igormq/ctc_tensorflow_example 看到一个适用于 TensorFlow 的工作示例(使用玩具数据集)。
请随意使用!
【讨论】:
我相信我们的代码几乎相同,但收敛时间太长了,尤其是 47K 数据。链接:***.com/questions/38880176/… 看看你是否也能回答这个问题。谢谢以上是关于使用 TensorFlow 进行端到端语音识别的 RNN的主要内容,如果未能解决你的问题,请参考以下文章