【问题标题】:How to reshape the speech data as LSTM input?如何将语音数据重塑为 LSTM 输入?
【发布时间】:2023-12-16 11:49:02
【问题描述】:

我正在对语音数据中的语音和非语音进行分类,其中包含 3630371 个数据点和 39 个特征。即语音数据的形状是 (3630371, 39)。如何将其重塑为 LSTM 输入。 3D input_shape 必须是什么,或者“Samples”、“Timestep”和“Features”的值是什么。

下列说法正确吗?

data.reshape(3630371, 1, 39)
LSTM(32, input_shape = (1, 39))

请帮忙!我不知道。

【问题讨论】:

  • 您的 39 项功能是什么?或者你有 300 万个音频片段,每个片段都包含 39 个样本的序列?
  • 所有剪辑合并成一个有300万个块,每个20ms的块有39个特征。
  • 好的,如果你有 1 个包含 300 万个时间戳的序列,每个时间戳都有 39 个特征,那么形状应该是 (1, 3630371, 39)。但是,仅使用一个训练样本并不能做很多事情,而且 LSTM 无法处理那么长的序列。数据如何标注?你有每个块的语音/非语音标签还是整个系列只有一个?
  • 每个块都有标签。如何将其提供给 LSTM?
  • 如果你有每个块的标签,那么你没有分类序列,你对每个单独的块进行分类,这样你就可以使用密集层。除非你想做一些事情,比如把 N 个块放在一起,然后对其中至少一个是否包含声音进行分类

标签: keras deep-learning lstm recurrent-neural-network speech


【解决方案1】:

LSTM 输入:(no of samples, timesteps, features)

data.reshape(3630371, 1, 39)
LSTM(32, input_shape = (1, 39))

在上面的代码中,您实际上只有 1 个时间步长,它没有利用 LSTM 的能力。您正在做的是:第一个时间步长中的 LSTM 将 39 维向量作为输入并终止迭代。

另一种选择是给出 39 个时间步的标量。

data.reshape(3630371, 39, 1)

这里 LSTM 循环 39 次(39 个时间步),但在每个时间步都将一个标量作为输入。

事实上,在no_timestep x feature_dim = total_input_dimension 之前,任何其他组合都可以。通常,这在很大程度上取决于您正在使用的域修复这些数字。

【讨论】:

  • 最后一个参数不应该是no。的特征是 39?
  • 如果您的样本由 39 维向量描述,(即)如果您想将每 39 个暗向量分类为语音和非语音,上述方法将有效。 (这里您拥有的数据点数是 3630371)。如果您想对 3630371 个 39 维向量进行总体描述,这意味着您只有一个样本(数据点)并且时间步数变为 3630371,则 feature dim 为 39。LSTM 在这种情况下不起作用。
  • 好的,谢谢。