Как подогнать модель scikit для векторов признаков разной длины - PullRequest
0 голосов
/ 14 июля 2020

Я работаю над проектом классификации звука , учитывая набор аудиозаписей, я пытаюсь определить, к какому классу будет относиться определенная запись. Вы можете сравнить это с проблемой распознавания жанра musi c или topi c (основной части текста), мои образцы имеют разную длину, и мне нужно назначить каждому образцу точно одну метку.

Я представляю свои функции в виде 2-мерных матриц, где каждый столбец представляет собой кадр в аудиофайле (например, 0,1 секунды), а каждая строка является функцией, относящейся исключительно к этому временному кадру (например, коэффициенты MF CC). Теперь, хотя мое количество строк будет фиксированным, количество столбцов будет варьироваться в зависимости от длины записи.

Я загружаю данные для обучения и тестирования в виде массивов numpy, они содержат 2D nxy матрица для каждой выборки, где n - константа (т.е. 13), а y - переменная, которая зависит от длины текущей выборки.

...

Unfortunately, scikit-learn doesn't seem to be a big fan of this, time and time again raising me a ValueError: setting an array element with a sequence.. Now I've seen a number of solutions:

  1. Using one of the gadgets in sklearn.feature_extraction to vectorize features in a sequence (text, images of varying size etc.), though most examples I've seen are for text-based problems, so I'm not entirely sure how applicable they are for an audio problem like this.
  2. Taking the mean of the columns to produce a single time-independent feature vector (as can be seen here https://www.youtube.com/watch?v=N1rcKBHlw-Y)
  3. При использовании такой модели, как K-NN, расстояния можно предварительно вычислить вручную, минуя scikit «последовательность или массив?» проверяет все вместе.

Теперь из этих трех я бы предпочел что-то похожее на # 1, так как кажется, что это подход, для которого оптимизирован scikit. Есть идеи?

Ответы [ 2 ]

1 голос
/ 16 июля 2020

Стандартный способ работы со звуком переменной длины (или другим временным рядом) - разбить его на набор анализов фиксированной длины windows. Пример кода здесь . Затем можно объединить результаты прогнозов, например путем голосования .

1 голос
/ 14 июля 2020

Padding также можно использовать, если вы хотите иметь фиксированную форму ввода. С помощью заполнения вы добавляете значения (обычно ноль) к примерам меньшей длины, чтобы они были того же размера, что и другие примеры.

Есть несколько стратегий заполнения (например, предварительное заполнение , когда вы добавляете значения в начало последовательности; post-padding, когда вы добавляете значения в конец последовательности. Следующая ссылка охватывает эти стратегии заполнения: Подготовка данных для входных последовательностей переменной длины . ( Tensorflow предоставляет функцию последовательности заполнения: Pad_sequences Tensorflow .)

Заполнение обычно используется в задачах обработки естественного языка (NLP), когда закодированные последовательности (предложения) имеют разную длину. Здесь приложение pad_sequence в задаче НЛП вы можете найти пример, который использует тензорный поток pad_sequences () для предварительной обработки данных в задаче НЛП.

В вашем случае можно выполнить предварительную обработку перед загрузкой данных к вашей модели. На этом этапе предварительной обработки вы измените свой длина входных данных во входные данные фиксированной длины через функцию pad_sequences ().

...