0

我正在做一个声音分类项目,给定一组录音,我试图确定某个录音属于哪个类别。您可能会将其与音乐流派或主题识别(文本主体)问题进行比较,我的样本长度不同,我需要为每个样本精确地分配一个标签。

我将我的特征表示为 2d 矩阵,其中每一列代表音频文件中的一个帧(例如 0.1 秒),每一行是一个仅与该时间帧相关的特征(例如 MFCC 系数)。现在虽然我的行数是固定的,但列数会根据记录的长度而变化。

我将训练和测试数据作为 numpy 数组输入,它们包含每个样本的 2D nxy矩阵,其中n是一个常数(即 13),y是一个变量,它取决于当前样本的长度。

...

不幸的是,scikit-learn 似乎不是这个的忠实拥护者,一次又一次地提高我一个ValueError: setting an array element with a sequence.. 现在我看到了许多解决方案:

  1. 使用其中一个小工具sklearn.feature_extraction对序列中的特征(文本、不同大小的图像等)进行矢量化,尽管我看到的大多数示例都是针对基于文本的问题,所以我不完全确定它们对像这样的音频问题。
  2. 取列的平均值来产生一个与时间无关的特征向量(可以在这里看到https://www.youtube.com/watch?v=N1rcKBHlw-Y
  3. 当使用像 K-NN 这样的模型时,可以手动预先计算距离,绕过 scikit 的“序列还是数组?” 完全检查。

现在在这三个中,我更喜欢类似于 #1 的东西,因为感觉这是 scikit 优化的方法。有任何想法吗?

4

2 回答 2

3

处理可变长度音频(或其他时间序列)的标准方法是将其拆分为一组固定长度的分析窗口。示例代码在这里。然后可以合并预测结果,例如通过投票

于 2020-07-16T13:57:13.573 回答
1

当您想要具有固定的输入形状时,填充也是一种选择。使用填充,您将向长度较小的示例附加值(通常为零),以便它与其他示例具有相同的大小。

有一些填充策略(例如,预填充,将值附加到序列的开头;后填充,将值附加到序列的末尾。以下链接介绍了这些填充策略:数据准备可变长度输入序列。(Tensorflow 提供了一个填充序列函数:Tensorflow 的 pad_sequences。)

当编码序列(句子)的长度不同时,填充通常用于自然语言处理(NLP)任务。在 NLP 任务中的 pad_sequence 应用程序中,您可以找到一个使用 tensorflow 的 pad_sequences() 对 NLP 任务中的数据进行预处理的示例。

在您的情况下,一个选项是在将数据提供给您的模型之前执行预处理步骤。在此预处理步骤中,您将通过 pad_sequences() 函数将可变长度输入数据转换为固定长度输入数据。

于 2020-07-14T14:55:40.533 回答