Узнайте, как классифицировать музыкальные жанры с помощью CNN.

В предыдущей части мы научились извлекать признаки из аудиосэмплов. Теперь, когда у нас есть разные функции, мы переходим к задаче классификации. Сначала мы будем использовать функции по отдельности для классификации аудиосэмплов, а затем мы будем использовать совокупность всех функций для классификации.

Шаг 1. Импортируйте библиотеки

Шаг 2: Импортируйте файл npz, извлеките функции и разделите данные тренировочного теста.

Мы извлекли эти функции в предыдущей статье и сохранили их в файле npz. Мы просто загружаем этот файл сюда.

Шаг 3. Изменение размера и формы данных

Операция масштабирования применяется только к обучающему набору данных. Во время тестирования тот же максимум (из обучающих данных) используется для масштабирования тестовых данных.

Итак, находим максимум S_train и делим S_train на максимум. Во время тестирования мы также делим S_test на максимальное значение S_train.

После этого мы преобразуем данные в форму (N, строка, столбец, 1), потому что CNN требует, чтобы ввод был в этой форме. Это указывает на то, что в изображении есть только один канал. Исходная форма спектрограммы (944, 1025, 1295).

Первоначальная форма MFCC (944, 10, 1293). Сначала мы изменяем размер поезда MFCC и тестовых данных до (944, 120, 600). После этого мы преобразуем данные в (N, row, col, 1) для CNN. Затем мы стандартизируем данные.

Первоначальная форма Мел-спектрограммы (944, 128, 1293). Сначала мы масштабируем данные поезда и теста, используя максимум данных поезда. Затем мы преобразуем данные в (N, row, col, 1) для CNN.

Шаг 4. Сохраните функции обучения и тестирования в файле npz.

Для всех моделей мы установили эпохи равными 100, размер пакета — 32, а скорость обучения — 0,001.

Шаг 5: Классификация с использованием спектрограммы

Сначала мы загрузим данные разделения поезда-теста (файл .npz) спектрограммы. Затем мы определяем модель CNN для классификации. Мы использовали ReLU в качестве функции активации на слоях, за исключением последнего слоя, где мы использовали softmax. Затем мы использовали оптимизатор Adam. У нас есть контрольная точка через каждые 5 эпох, которую мы можем использовать, если в любом случае наша модель прерывается во время обучения. После этого сохраняем нашу обученную модель.

Теперь мы можем прокомментировать часть обучения модели и загрузить обученную модель. Мы вычисляем точность обучающих данных, а затем тестируем данные. Затем мы отображаем матрицу путаницы для тестовых данных. Мы достигли точности 71,96% на тестовом наборе данных.

Теперь для этого проекта мы использовали две модели спектрограмм. Приведенный ниже код является второй моделью для спектрограммы. Мы достигли точности 73,54% на тестовом наборе данных. Мы рассмотрим обе модели, взяв ансамбль.

Матрица путаницы для лучшей модели спектрограммы показана ниже.

Шаг 6: Классификация с использованием MFCC

Для MFCC мы обучили три модели и использовали ансамбль из трех моделей, чтобы сообщить о точности. Мы также использовали k-кратную перекрестную проверку с k = 10. Мы достигли точности 74,07% на тестовых данных.

Мы снова загружаем сплит-тест для MFCC и определяем модель.

Теперь, поскольку мы будем использовать ансамбль из трех моделей MFCC, мы определим функцию, которая будет получать большинство голосов от трех моделей. Затем мы обучаем все три модели.

После обучения моделей мы загрузим модель и отправим y_pred в функцию get_majority().

Мы достигли точности 74,07% на тестовых данных. Матрица путаницы для MFCC показана ниже.

Шаг 7: Классификация с использованием Mel-спектрограммы

Мы достигли точности 75,13% на тестовых данных. Матрица путаницы для Mel-спектрограммы показана ниже.

Шаг 8: Создайте ансамбль спектрограмм, мел-спектрограмм и MFCC CNN.

Теперь для ансамбля мы загрузим все модели (используйте новый файл, чтобы избежать путаницы и ошибок) и вычислим y-pred. Этот ансамбль содержит 2 модели Spectrogram, 3 модели MFCC и 1 модель Mel-Spectrogram. После этого мы отправим прогнозы в функцию get_majority и сообщим о точности ансамбля.

Точность, достигнутая при использовании ансамбля, составляет 79,36%.

Матрица путаницы ансамбля показана ниже.

Заключение

Мы научились использовать CNN для классификации музыкальных жанров. Данные тестирования были вынесены отдельно, чтобы избежать утечки данных. Во-первых, признаки обучаются отдельно для классификации. Во-вторых, создается ансамбль различных признаков и делаются прогнозы с использованием стратегии голосования по большинству. Мы использовали 2 модели спектрограммы, 3 модели MFCC и 1 модель Mel-Spectrogram. Мы достигли точности 79,36% для ансамбля, что значительно лучше по сравнению с моделями с отдельными признаками. Это показывает надежность и эффективность использования ансамблевой модели. Среди неправильно классифицированных жанров самым ошибочно классифицированным жанром был «Рок». В основном его неправильно классифицировали как «металл», «диско», «блюз» и «кантри». Вторым наиболее неправильно классифицированным жанром был «кантри», и он был ошибочно классифицирован с «роком», «регги» и «блюзом».

Полный код доступен на Github.

Спасибо за прочтение! Я надеюсь, что вы нашли эту статью полезной.

Вперёд, аллигаторы!🐊