Как я построил классификатор радиоволн ResNet с помощью Keras

Люк Кербс и Джордж Уильямс ([email protected])

Вступление

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

В этом блоге я познакомлю вас с Google Cloud Platform и покажу, как создать классификатор сигналов ResNet на Python с помощью Keras. Вот ссылка на мой GitHub с кодом ResNet: GitHub.

Этот блог разбит на четыре части:

  • Знакомство с Google Colaboratory
  • Настройка экземпляра виртуальной машины с графическим процессором Tesla V100
  • Подключение ноутбука Colab к виртуальной машине в облаке
  • Написание и обучение ResNet на Python с помощью Keras с нуля

Часть I. Настройка Google Colab

Авторы статьи включают ссылку на набор данных, который использовался в эксперименте, чтобы мы могли проводить наши собственные эксперименты и учебные занятия. Я расскажу вам о своем опыте написания кода ResNet и воспроизведении эксперимента из статьи.

Начиная

Прежде чем кодировать и обучать ResNet, необходимо учесть следующее: Большой объем данных означает много времени на обучение. Сначала я начал обучать свою модель ResNet на моем Macbook Pro 2015 года с процессором Intel i5. Каждая эпоха занимала примерно 3 часа, чтобы заполнить базу данных из миллиона сигналов… Не идеально при планировании обучения на более чем 100 эпох. К счастью, Google предоставляет удобное (и бесплатное) решение для ускорения процесса:

Что такое Google Colaboratory?

Google Colaboratory - это бесплатная установка Jupyter Notebook, которая полностью основана на облаке, доступна через ваш браузер и очень проста для немедленного использования. Не нужно загружать Python, Jupyter Lab или устанавливать общие библиотеки машинного обучения - среда поставляется заранее настроенной для наших потребностей в глубоком обучении. Google Colab позволит нам писать и запускать Jupyter Notebooks прямо в браузере с привлекательным и интуитивно понятным пользовательским интерфейсом.

  1. Перейдите в Google Colab и нажмите НОВАЯ КНИЖКА PYTHON 3.

2. Вы попадете в новый блокнот Google Colab:

3. Настройте Colab для работы на графическом процессоре:

Colab предлагает бесплатное использование графического процессора Tesla K80 с оперативной памятью до 25 ГБ и 12 часами работы. Это так же просто, как перейти в раскрывающееся меню Время выполнения, выбрать изменить тип среды выполнения и выбрать GPU в раскрывающемся меню аппаратного ускорителя.

Работая с таким большим набором данных (миллион сигналов), я столкнулся с проблемами нехватки памяти в настройках Colab по умолчанию и решил перейти на более мощный экземпляр виртуальной машины Google Cloud Platform. Тот, который я использовал, стоит около 50 центов в час для бега. Просто не забудьте выключить его, когда закончите тренировку, чтобы избежать ненужных расходов.

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

Часть II: Настройка виртуальной машины с графическим процессором

Google Cloud предлагает множество сервисов облачных вычислений. Я использовал Google Cloud Platform, чтобы запустить сеанс обучения на экземпляре виртуальной машины с графическим процессором Tesla V100 и 50 ГБ памяти.

Создание проекта Google Cloud Platform

  1. Перейдите в Google Cloud Platform и нажмите СОЗДАТЬ ПРОЕКТ.

2. Выберите название проекта и нажмите СОЗДАТЬ.

Создание экземпляра виртуальной машины

  1. Перейдите в Deep Learning VM Google Cloud и нажмите ЗАПУСК НА КОМПЬЮТЕРНОМ ДВИГАТЕЛЕ.

2. Выберите свой проект.

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

3. Вы попадете на страницу Развертывание виртуальной машины с глубоким обучением. Задайте имя развертывания, выберите тип графического процессора и убедитесь, что включены следующие параметры:

4. Примите условия обслуживания и нажмите Развернуть.

5. Вы успешно развернули виртуальную машину с глубоким обучением! Вы можете проверить это, выбрав Compute Engine - ›Экземпляры ВМ.

6. Выберите экземпляр виртуальной машины и нажмите кнопку start.

Теперь ваша виртуальная машина работает. Наконец, мы установим инструмент командной строки gcloud, который поможет нам получить удаленный доступ к нашей виртуальной машине.

Установка инструмента командной строки gcloud

Google Cloud предоставляет множество вариантов установки для разных операционных систем. Я покажу вам процесс установки для macOS, но вы можете следовать одному из Быстрых запусков Google Cloud, если вы работаете в другой системе.

  1. Скачайте архивный файл.
  2. Распакуйте архивный файл в свой домашний каталог.
  3. Инициализируйте SDK, выполнив в терминале следующую команду:
gcloud init

4. Примите вариант входа в систему, используя свою учетную запись Google: введите Y, чтобы принять.

To continue, you must log in. Would you like to log in (Y/n)? Y

5. При появлении запроса войдите в свою учетную запись Google и разрешите доступ к ресурсам Google Cloud Platform.

6. Вернувшись в терминал, вам будет предложено выбрать проект Cloud Platform. Выберите созданный вами проект. Если у вас только один проект, вы можете пропустить этот шаг.

7. Выберите зону Compute Engine по умолчанию.

8. Запустите gcloud init в командной строке, чтобы убедиться, что вы успешно выполнили все шаги:

gcloud init

Выполнено! - gcloud установлен, и мы готовы получить доступ к нашей виртуальной машине.

Доступ к вашей виртуальной машине

  1. В терминале просмотрите информацию об экземпляре виртуальной машины, запустив:
gcloud compute instances list

Информация о вашем уникальном экземпляре будет отображаться следующим образом:

2. ssh на вашу виртуальную машину с помощью следующей команды (убедитесь, что вы используете свое уникальное имя экземпляра):

gcloud compute ssh <instance-name> -- -L 8888:localhost:8888

3. Вы подключены к своей виртуальной машине удаленно!

4. Выполните следующую команду, чтобы просмотреть информацию о графическом процессоре виртуальной машины:

nvidia-smi

Я использую графический процессор Tesla V100 (такой же, как описано в документе). Тип вашего графического процессора может отличаться в зависимости от того, как вы настроили виртуальную машину с глубоким обучением.

Часть III: Подключение Colab к вашей виртуальной машине

Почти готово!

Теперь осталось только подключить виртуальную машину, которую мы только что создали, с нашим Colab Notebook.

  1. Запустите следующий код в командной строке виртуальной машины:
jupyter notebook \
  --NotebookApp.allow_origin='https://colab.research.google.com' \
  --port=8888 \
  --NotebookApp.port_retries=0

Это позволит вашему Google Colab получить доступ к вашей виртуальной машине.

2. Вернитесь к записной книжке Colab, которую вы создали ранее в браузере.

3. Выберите Подключиться к локальной среде выполнения в раскрывающемся меню Подключиться.

4. Введите внутренний порт: 8888 и нажмите ПОДКЛЮЧИТЬСЯ.

5. Готово! Ваш ноутбук Colab теперь подключен к вашей виртуальной машине.

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

Готовы начать кодирование

Наконец, самое интересное! Теперь мы готовы приступить к написанию ResNet на Python.

Часть IV: Кодирование ResNet на Python с помощью Keras

Прежде, чем мы начнем

Теперь мы рассмотрим пошаговый процесс построения ResNet на Python. Если вы хотите взглянуть на код целиком, вот ссылка на мой Google Colab: Блокнот классификатора сигналов ResNet.

Colab предлагает классную функцию под названием Playground, которая позволит вам редактировать и выполнять код ResNet из моего блокнота прямо в вашем браузере:

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

Керас: библиотека глубокого обучения Python

Keras - это высокоуровневый API нейронных сетей, который может работать поверх Tensorflow, а также некоторых других фреймворков машинного обучения. Keras разработан с упором на обеспечение возможности быстрого экспериментирования, упрощения процесса построения нейронных сетей и тестирования моделей.

Если вы впервые используете Keras, но относительно знакомы с концепциями глубокого обучения, вы все равно сможете без особых проблем следить за кодом. Тем не менее, я рекомендую ознакомиться с Функциональным API Keras, прежде чем мы углубимся.

Импорт библиотек

Создайте новую ячейку в своем блокноте Colab и введите следующий код для импорта всех необходимых модулей:

Получение и загрузка данных

Исходный набор данных от Deepsig.io представлен в формате .hdf5. Я преобразовал данные в формат .npy, так как обнаружил, что загрузка занимает гораздо меньше времени. Сигналы делятся на данные обучения, тестирования и проверки. Вот ссылки на небольшой и большой набор данных помеченных сигналов:

Ссылка для скачивания: Набор данных (9,1 ГБ)

После загрузки вы можете перенести набор данных с локального компьютера в экземпляр облака Google с помощью команды:

gcloud compute scp dataset.zip <instance-name>:~

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

Импорт библиотек глубокого обучения

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

Остаточный стек

Это часть сети, которая делает нейронную сеть остаточной нейронной сетью. Обратите внимание, как x_shortcut сохраняет состояние x и добавляется обратно после (или пропускает) двух сверточных слоев - это пропустить соединение.

Определите модель

Мы добавляем пять остаточных стопок и два плотных слоя с выпадением для регуляризации. Последний слой - это результат вероятностей классификации.

Добавить вариант для сохранения модели

Если вы хотите сохранить веса модели и историю, включите следующий код в новую ячейку и установите для save_model и save_history значение True.

Задайте параметры модели и измените данные

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

Инициализировать и обучить модель

Наконец, мы инициализируем модель и используем model.fit () для обучения сети. В Keras есть удобная функция сводка, которая дает вам высокоуровневую информацию о вашей модели. Эта модель имеет 287 056 обучаемых параметров.

Сохранить историю модели (необязательно)

Если вы хотите сохранить информацию о точности и потерях модели для каждой эпохи обучения, введите следующий код в новую ячейку:

Запустите код и обучите модель

Вот и все! Теперь вы можете запустить код в Блокноте и начать обучение своей модели. Я обучил свою модель на 1,2 миллиона сигналов за 100 эпох. Это потребовало около 15 часов тренировки на моем GPU Tesla V100 - я оставил его работать на ночь и вернулся к нему на следующий день ...

Оцените модель

Модель достигла общей точности 96,4% по данным тестирования с высоким SNR * (по сравнению с точностью, указанной в документе, равной 99,7%). Не хватает бумаги на 3,3%.

График ниже показывает общую точность модели по ОСШ. При SNR 10 и выше модель показывает очень надежную работу. Как и ожидалось, чем больше помех в сигнале, тем сложнее его точно классифицировать.

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

синяя линия представляет данные обучения, а оранжевая линия представляет данные проверки. Модель обучается очень быстро в течение первых 10 периодов, а затем медленно, но последовательно набирает обороты, пока не наступит плато обучения. Обратите внимание, что диаграмма показывает максимальную точность классификации 60% - это потому, что модель тестируется до ее абсолютных пределов на смеси чистых сигналов и сигналов с очень высокими помехами. Некоторые из сигналов содержат настолько много шума, что их практически невозможно распознать.

Достигая максимальной точности 96,4% на наборе данных чистого сигнала, модель, конечно, не идеальна. Вот пример сигнала, который был неправильно классифицирован моделью; этот конкретный сигнал AM-DSB-SC (слева) был ошибочно классифицирован как сигнал 128QAM (типичный пример показан справа).

Сигналы AM-DSB-SC и 128QAM легко спутать, поскольку они очень похожи. Даже опытному глазу бывает трудно различить эти сигналы.

Вот ссылка для скачивания весов для модели, которую я тренировал. Если вы не хотите тратить время на обучение собственной модели, но все же хотите протестировать классификатор сигналов, вы можете просто загрузить предоставленные веса и попробовать протестировать несколько примеров сигналов. Вот ссылка на руководство по загрузке весов в Keras на случай, если вы застряли: Как загрузить модель Keras.

Заключение

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

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