【问题标题】:How to fit a scikit model, for feature-vectors of varying lengths如何为不同长度的特征向量拟合 scikit 模型
【发布时间】:2020-11-03 17:20:12
【问题描述】:

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

我将我的特征表示为 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 优化的方法。有什么想法吗?

【问题讨论】:

    标签: scikit-learn scipy audio-processing librosa sound-recognition


    【解决方案1】:

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

    有一些填充策略(例如,预填充,将值附加到序列的开头;后填充,将值附加到序列的末尾。以下链接介绍了这些填充策略: Data Preparation for Variable Length Input Sequences.(Tensorflow 提供了填充序列功能:Tensorflow's pad_sequences.)

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

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

    【讨论】:

    • 使用 Padding 的问题是您需要知道录音的最大长度。我想如果我把它当作 max 之类的东西,它可能会起作用。 3 秒。感谢您的建议!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-08-18
      • 2021-07-09
      • 2014-01-07
      • 2017-08-24
      • 1970-01-01
      • 2021-09-02
      • 2019-05-22
      • 1970-01-01
      相关资源
      最近更新 更多