В моем предыдущем посте я объяснил, как мы можем применять различные методы увеличения данных к аудиофайлам. В этом посте мы собираемся глубоко погрузиться в создание нашего собственного классификатора звука с помощью библиотеки fastai.

Давайте начнем

Термин «глубокое обучение» используется, когда нейронная сеть имеет много скрытых слоев. Это помогает нам решать сложные проблемы, такие как распознавание изображений, обнаружение объектов, анализ временных рядов и т. Д. Используя тот же метод, мы собираемся классифицировать звуковые волны.

В этом посте мы будем использовать набор данных свободно-говорящий-цифровой набор данных. Это бесплатный аудио набор голосовых данных. Думайте об этом как о MNIST для аудио. Он состоит из 2000 записей 4-х динамиков (по 50 каждой цифры на динамик).

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

librosa, fast.ai, matplotlib широко используются в этой статье. Прежде чем продолжить, важно ознакомиться с этими библиотеками и различными концепциями глубокого обучения, такими как CNN, функции потерь, дискриминативное обучение и т. д. Для различных концепций глубокого обучения вы можете просмотреть документацию fast.ai.

Полезные функции здания

Нам потребуются две служебные функции для предварительной обработки наших данных. Во-первых, для применения различных дополнений к нашим данным, а во-вторых, для преобразования файлов .wav в спектрограмму.

Я создал функцию с именем: audioDataTransforms, которая добавит белый шум, сдвинет волну во времени и применит растяжение по времени и изменение высоты тона к исходному файлу .wav. Ниже приведен код для audioDataTransforms

Эту функцию следует вызывать для каждого файла .wav в нашем исходном наборе данных.

Вторая полезная функция: wavesToSpecs преобразует каждый файл .wav в спектрограмму. Спектрограмма — это визуальное представление силы сигнала во времени на различных частотах. После получения спектрограммы сохраняем ее в виде изображения с расширением .png. Ниже приведен код для wavesToSpecs

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

Создание набора данных

Мы создадим набор данных, используя библиотеку fast.ai. Эта библиотека имеет множество функций для создания набора данных. Fast.ai предоставляет API, называемый API-интерфейсами блоков данных, который очень гибок для создания набора данных любым удобным для нас способом. Прежде чем продолжить, прочтите о data_block api.

Путь создания набора данных прост:
1. Фрейм данных, содержащий имена и метки изображений.
2. Получение данных с помощью фрейма данных.
3. Создание пакета данных.

Создание фрейма данных
Каждый файл в нашем наборе данных имеет следующее соглашение об именах: {label}_{recorder_name}_{recording_index}.wav

Нас интересует только часть этикетки. Я создал скрипт, который поможет нам создать фрейм данных для таких сценариев:

Извлечение данных из Dataframe и создание DataBunch
Этого можно добиться с помощью API data_block. С помощью этих API мы сначала скажем ему получить информацию о данных из фрейма данных с помощью ImageList.from_df. Мы также сообщим ему, где он может найти данные, используя аргумент path. Мы также можем сказать ему случайным образом разделить данные, используя split_by_rand_pct, и взять метки из столбца labels. Наконец, мы изменим размер изображения на 224 с transforms и создадим пакет данных с нормализованными данными. Databunch — это класс в библиотеке fast.ai, в котором хранятся загрузчики данных для обучения и проверки.

Прелесть API data_block заключается в том, что мы можем легко понять функциональность, просто прочитав код.

Визуализация набора данных

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

Мы успешно подготовили набор данных. Пора переходить к заключительной части.

Создание классификатора изображений

Теперь мы создадим модель классификации изображений с помощью fastai. Я настоятельно рекомендую ознакомиться с документацией библиотеки fastai, прежде чем продолжить. Подробности создания и обучения модели CNN можно найти здесь.

Мы собираемся следовать подходу трансферного обучения. Для трансферного обучения мы будем использовать предварительно обученную модель под названием resnet34. Fastai легко позволяет нам создать модель для трансферного обучения с помощью функции cnn_learner. Код ниже строки делает все, что мы обсуждали выше

model = cnn_learner(il, models.resnet34, metrics=[accuracy],callback_fns=ShowGraph)

В cnn_learner мы передали наш набор данных il, предварительно обученную модель resnet34, метрики точности и некоторые функции обратного вызова, которые помогут построить график на каждой итерации.

Fastai также предоставляет некоторые удобные функции, такие как lr_find. Эта функция строит график потерь в зависимости от скорости обучения. Мы будем использовать это, чтобы найти наиболее подходящую скорость обучения для достижения максимальной точности. Для этого мы выбираем скорость обучения на одну или две величины ниже скорости обучения, при которой происходит превышение потерь.

Здесь, поскольку LR выходит за пределы 1e-01, поэтому мы выбираем LR как 5e-03

Наконец, мы вызовем метод fit, чтобы начать обучение нашей модели.

model.freeze()
model.fit(5,5e-3)

Вышеописанный шаг займет некоторое время. После последней итерации мы достигаем точности 96,8% всего за 5 эпох с 10 000 выборок.

Поздравляем, мы успешно создали классификатор изображений для классификации цифр в звуке. Полный код вы можете найти здесь.

Если вы нашли эту статью полезной, нажмите кнопку аплодисментов и помогите мне донести ее до большего числа людей, которым нужна помощь в начале работы с данными. Я также ценю ваши ответы. Вы также можете найти меня в Твиттере