Сейчас конец 2019 года, и Deep Learning больше не модное слово. Он широко используется в технологической индустрии для достижения чудес, на достижение которых традиционное машинное обучение и методы, основанные на логике, потребовалось бы больше времени.

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

Нейронные сети называются так потому, что предполагается, что они каким-то образом имитируют человеческий мозг. Хотя это не совсем так, но механизм обучения во многом похож по своей природе.

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

Например, давайте рассмотрим архитектуру LeNet. Это небольшая двухслойная CNN (сверточная нейронная сеть). Сверточные нейронные сети - это особый вид нейронных сетей, в которых математические вычисления, выполняемые на каждом уровне, представляют собой операции свертки.

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

Это было простое введение в то, что такое нейронные сети и как они себя ведут.

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

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

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

К тому же отладка нейронных сетей - чрезвычайно громоздкая задача. Производительность вывода разных нейронных сетей может отличаться по разным причинам. Некоторые из возможных причин могут быть неадекватной предварительной обработкой данных, неправильным оптимизатором, слишком низкой или слишком высокой скоростью обучения. Количество переменных, влияющих на производительность нейронной сети, довольно велико. Следовательно, важно, чтобы каждый параметр должным образом отслеживался и поддерживался.

Некоторые из доступных опций включают печально известную Tensorboard, Bokeh и многие другие.

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

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

Мы будем использовать набор данных FashionMNIST. Он содержит в общей сложности 70000 изображений в градациях серого (обучение: тест = 60000: 10000), каждое из которых имеет масштаб 28x28, связанное с одним из 10 классов. (Рисунок 1)

Структура папок нашего проекта выглядит так, как показано на рисунке 2 ниже.

Папка данных содержит файлы набора данных fashion mnist, которые будут использоваться для обучения модели. Папка db содержит код драйвера python для выполнения операций с коллекциями MongoDb. MongoDB - чрезвычайно простая в использовании база данных NoSql, созданная для удовлетворения требований разработчиков. Он легко интегрируется с современными приложениями, и большое сообщество разработчиков регулярно вносит свой вклад в его расширения. Папка модели содержит фрагмент кода с определением модели нейронной сети. Папка mlruns создается автоматически после вызова mlflow в основном коде.

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

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

На рис. 3, показанном ниже, мы импортируем модный mnist из keras.datasets и выполняем необходимый шаг нормализации.

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

После этого мы продолжим и напишем необходимый код драйвера для управления нашим вновь созданным набором данных с помощью MongoDb. Кто-то может сказать, что использование MongoDb для такого небольшого проекта может быть излишним, но лично я считаю, что MongoDb - отличный инструмент для управления данными. с гибкостью. Учитывая отсутствие схемы в NoSql, управлять коллекциями и документами очень просто.

Легкость, с которой любой документ можно редактировать в MongoDB, просто великолепна. Самое приятное то, что всякий раз, когда запрашивается коллекция, возвращается результат json, что упрощает анализ с использованием любого языка программирования. Запросы агрегирования в mongo также очень просты и позволяют пользователям быстро создавать перекрестные ссылки на коллекции.

Чтобы связать наши скрипты Python с MongoDb, мы будем использовать pymongo, который можно легко установить с помощью pip install pymongo. Чтобы установить MongoDb, следуйте этому руководству https://docs.mongodb.com/manual/tutorial/install-mongodb-on-ubuntu/

После того, как MongoDb будет установлен и протестирован для правильной работы в вашей системе, создайте новую базу данных с именем fashion_mnist. Внутри базы данных создайте новую коллекцию с именем dataset, как показано на рисунке 5 ниже.

Отличный графический интерфейс для взаимодействия с MongoDb - это robo3t. Это бесплатно и просто в использовании. Его можно скачать по следующей ссылке https://robomongo.org/download. Поскольку наша БД настроена и наборы данных созданы, мы можем продолжить выполнение задачи. вставки необходимой информации в коллекцию данных

На рис. 6, показанном выше, мы импортируем MongoClient из библиотеки pymongo, которая будет использоваться для подключения к наша база данных mongoDB.

Рис. 7 ниже описывает класс mongoQueue, который был написан для взаимодействия с нашей коллекцией наборов данных. В строках 18 и 19 инициализируется имя коллекции, которое используется во всех функциях-членах. Метод Enqueue в строке 6 используется для вставки информации о наборе данных в коллекцию наборов данных. Метод Dequeue в строке 10 выбирает первый набор данных, в поле status которого указано 'Not Обработано '. setAsProcessing и setAsProcessed методы используются для установки поля статуса соответствующих документов набора данных в коллекции.

Мы используем метод insert_into_db, показанный на рис. 8, строка 1, для вставки информации о наших недавно созданных наборах данных в нашу коллекцию наборов данных mongoDb. В строке 23 функции main мы перебираем папку набора данных и вызываем insert_into_db, чтобы вставить необходимую информацию для этого набора данных в коллекцию. После того, как каждый набор данных будет успешно вставлен в коллекцию, поля появятся, как показано на рисунке 9 ниже.

Теперь мы можем определить нашу модель для обучения нашей сети глубокого обучения. Внутри model / model.py мы импортируем все необходимые пакеты keras для построения нашей сети CNN (показано на рис. 10a. )

На рис. 10b показана архитектура модели. Это простая двухуровневая CNN с двумя уровнями MaxPool и активацией RelU между ними. Также добавлены два слоя Dense с 32 и 10 нейронами соответственно. Я также добавил Dropout 0,5 перед последним плотным слоем.

Теперь в нашем скрипте train.py мы импортируем все необходимые модули из библиотеки keras, чтобы продолжить с нашим обучением. Вместе со всеми библиотеками keras мы также импортируем mlflow (рис. 11).

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

На рис. 12b мы определили нашу обучающую функцию, которая принимает аргументы trainX ( наш обучающий набор) , trainY ( метки обучающего набора ) и модель (модель CNN)

В строке 38 (на рис. 13) начинается функция main там, где мы определяем наш объект MongoQueue с помощью MongoQueue класс, определенный внутри упомянутого выше скрипта, db_ops.py. Как видно из строки 41, mq - это наш объект.

В строке 42 (рис. 13) создается новая модель CNN путем вызова функции model, которая принимает тип оптимизатора в качестве входных данных. В этом эксперименте мы будем использовать «SGD» (Стохастический градиентный спуск) для обучения сети.

Каждый раз, когда мы вызываем mlflow в нашем обучающем коде для ведения журнала, это называется запуском mlflow. MlFlow предоставляет нам API для запуска и управления запусками MlFlow. Например, Рис. 14a и 14b.

В нашем коде мы запускаем выполнение mlflow с помощью диспетчера контекста python, как показано на рис. 14b.

В строке 46 на рис. 13 мы определяем наш mlflow запуск с именем запуска как 'fashion mnist'. . Все данные и показатели будут регистрироваться под этим именем запуска на панели управления mlflow.

В строке 47 мы запускаем цикл while, который непрерывно вызывает функцию dequeue из класса MongoQeueue. При этом выполняется выборка каждой строки, соответствующей определенному набору данных, из коллекции наборов данных, имеющей поле статуса = Не обработано (рис. 9). Как только этот набор данных получен, в строке 51 вызывается функция setAsProcessing , которая устанавливает статус этого набора данных на Processing в MongoDb. . Это позволяет нам понять, какой набор данных в настоящее время обучается нашей системой. Это особенно полезно в больших системах, где есть несколько наборов данных и много обучающих экземпляров, работающих параллельно.

В строках 54 и 55 наборы данных загружаются из папки data, соответствующей dataset_id, полученному из базы данных. .

Строки 57 и 58 загружают наборы тестов, а обучение начинается в строке 59 путем вызова функции train. Затем мы используем обученную модель для прогнозирования наших оценок, как показано в строке 60 на рис. 15.

Результат обучения выглядит так, как показано ниже (Рис. 16a и Рис. 16b).

Как показано на рис. 16b, обучение происходит для эпохи, и показатели оценки для тестового набора данных регистрируются.

Все результаты оценки, выполненной с использованием нашей обученной модели, могут быть зарегистрированы с помощью API отслеживания MlFlow (как показано на рис. 17). отслеживание API включает такие функции, как log_param и log_metric, который позволяет нам регистрировать каждый гиперпараметр и выходные значения в mlflow.

Лучшая функция mlflow - это панель управления, которую он предоставляет. Он имеет очень интуитивно понятный пользовательский интерфейс и может эффективно использоваться для отслеживания наших экспериментов. панель управления можно легко запустить, просто нажав mlflow ui в вашем терминале как показано на Рис. 18 ниже.

Чтобы получить доступ к панели управления, просто введите http: // localhost: 5000 в своем браузере и нажмите Enter.

На рис. 19 показано, как выглядит приборная панель. Каждый запуск MlFlow регистрируется с использованием идентификатора запуска и имени запуска . Журнал столбцов «Параметры» и «Метрики» отображает параметры и метрики, которые были записаны в журнал во время обучения нашей модели.

Дальнейшее нажатие на конкретный прогон переводит нас на другую страницу, где мы можем отобразить всю информацию о нашем прогоне (рис. 20).

MlFlow предоставляет нам эту удивительную функцию для создания графиков для наших результатов. Как вы можете видеть на рис. 21a, изменение точности теста можно визуализировать для разных наборов обучающих данных и времени. Мы также можем выбрать отображение других показателей, таких как потеря eval, как показано на рис. 21b. Плавность кривой также можно контролировать с помощью ползунка.

Мы также можем регистрировать важные файлы или сценарии в нашем проекте в MlFlow с помощью команды mlflow.log_artifact. На рис. 22а показано, как использовать его в сценарии обучения, а на рис. 22б показано, как он отображается на панели инструментов mlflow.

MlFlow также позволяет пользователям одновременно сравнивать два прогона и создавать для него графики. Просто установите флажки напротив прогонов, которые вы хотите сравнить, и нажмите синюю кнопку Сравнить (рис. 23).

После того, как вы нажмете на сравнение, появится другая страница, на которой все показатели и параметры двух разных прогонов можно просмотреть и изучить параллельно (рис. 24а).

Пользователь также может выбрать отображение таких показателей, как точность и потери, на параллельных графиках, как показано на рис. 24b.

Пользователи могут добавить файл проекта MlFlow (текстовый файл с синтаксисом YAML) в свой проект MlFlow, что позволит им лучше упаковать свой код, а также запускать и воссоздавать результаты с любого компьютера. Файл проекта MlFlow для нашего проекта fashion_mnsit выглядит так, как показано ниже на рис. 25a.

Мы также можем указать среду conda для нашего проекта MlFlow и указать conda. yaml (рис. 25b).

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

MlFlow также имеет множество других функций, которые выходят за рамки этого руководства и могут быть рассмотрены позже. Для получения любой информации о том, как использовать MlFlow, перейдите на страницу https://mlflow.org/