Создайте автоматический кодировщик для набора данных MNIST с помощью Keras и разверните его в веб-браузере с помощью Tensorflow.js

Автоэнкодеры показали себя как мощные инструменты обучения без учителя.

Цель автоэнкодера - изучить представление (кодирование) набора данных, обычно для уменьшения размерности, путем обучения сети игнорировать сигнал шум - Википедия

Автокодировщики продемонстрировали свою полезность при уменьшении размерности, кластеризации, обнаружении аномалий и устранении шумов. Стандартный автокодировщик состоит из кодировщика и декодера. Кодировщик кодирует входные данные автокодировщика в вектор / кодировку / скрытое пространство. Затем декодер декодирует закодированный вектор для воссоздания исходного ввода.

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

Это означает, что входной вектор непрерывно и последовательно преобразуется в векторы меньшей размерности по мере прохождения через слои нейронной сети кодировщика. Таким образом, закодированный вектор будет иметь меньшие размеры, чем входной вектор. Затем декодер пытается воссоздать исходный результат из этого вектора более низкой размерности. Чтобы это работало, исходная информация, содержащаяся во входном векторе, должна сохраняться в закодированном векторе, но в сжатой (низкоразмерной) форме или в скрытом пространстве. Скрытое пространство можно использовать для уменьшения размерности, кластеризации и т. Д.

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

Почему?

Почему бы и нет? ... это круто.

Это может дать нам интуитивное представление о том, как изображения обрабатываются нейронной сетью. И я уже упоминал, это круто.

Этапы этого упражнения:

1. Создайте и обучите автокодировщик на наборе данных MNIST.

2. Сгенерируйте кодировки двух случайных изображений и линейно интерполируйте кодировки.

3. Визуализируйте выходные данные декодера этих интерполированных кодировок.

4. Преобразуйте модель в Tensorflow.js.

5. Создайте веб-страницу для демонстрации интерполяции для просмотра в реальном времени :)

Я построил модель автокодировщика на Kaggle, используя оболочку Keras на Tensorflow. Код находится здесь. Коды для реализации Tensorflowjs можно найти здесь.

Я разделил эту статью на 2 сегмента:

1. Создание и обучение автокодировщика

2. Визуализация результатов на Tensorflow.js

Создание и обучение автокодировщика

Набор данных MNIST, пожалуй, самый известный набор данных изображений. Он находится в свободном доступе в библиотеках sklearn и keras. Он также размещен на kaggle. Я работал с набором данных на kaggle, потому что 1. Мне не нужно загружать набор данных. 2. Kaggle предоставляет бесплатные графические процессоры, что идеально подходит для обучения CNN.

Подготовка данных

Набор данных MNIST - это набор данных для ленивых. Он чистый и требует минимальной предварительной обработки. Для автокодировщика выход и вход модели одинаковы. Изображения имеют оттенки серого с размером 28 x 28. Функция ниже загружает изображения; изменяет масштаб значения от 0 до 1.

Модель

Модель состоит из 2 нейронных сетей:

Кодировщик: кодировщик представляет собой сверточную нейронную сеть, состоящую из слоев свертки и максимального объединения. Входом в файл является изображение размером 28 x 28 x 1. Сглаженный слой в конце генерирует плоский вектор размерности (128,) в качестве закодированного вектора.

Декодер. Декодер представляет собой сеть деконволюции. Он принимает на вход закодированный вектор (размер (128,)) и генерирует изображение (размер (28,28,1)) на выходе. Он состоит из нескольких сверточных слоев и слоев с повышающей дискретизацией для последовательного увеличения размеров закодированного вектора.

Автокодировщик = кодировщик + декодер

Обучение модели:

Модель автокодировщика обучена генерировать то же изображение, с которым она загружается.

Использование модели:

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

Шаг 1: мы берем 2 случайных изображения и генерируем кодировки, передавая их через кодировщик. Кодировки представляют собой плоские векторы длиной 128 каждый.

Шаг 2. Создайте интерполяцию (скажем, 10 линейных интерполяций) между двумя кодировками.

Шаг 3. Создайте изображения для каждой из этих интерполяций, пропустив их через декодер.

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

Шаг 1. Постройте обучающую модель

Мы катимся в глубине (извините .. не удержался 😛). Мы строим кодировщик и декодер, состоящий из 7 и 8 слоев соответственно.

Построение автоэнкодера

Разделительный энкодер

Разделительный декодер

Компилировать

Шаг 2. Определите генератор изображений

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

Шаг 3. Обучите модель

1 строка кода. Керас ты красавица ❤️

Шаг 4. Создайте кодировки

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

Шаг 5. Интерполируйте кодировки

Линейно интерполируйте кодировки с помощью функции ниже

Шаг 6. Расшифруйте интерполяцию

Модель декодера может генерировать изображения из изображений с помощью метода прогнозирования.

Шаги с 4 по 6 можно выполнить в коде, как показано ниже:

Результаты

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

А теперь займемся крутизной… Давайте сделаем плавную интерполяцию в реальном времени 😎

Запуск модели в браузере с помощью Tensorflow.js

В этом разделе я кратко опишу этапы развертывания модели на веб-странице и игры с интерполяцией в браузере.

Я не буду проводить здесь подробное пошаговое обсуждение. Я разместил коды здесь, если вам интересно.

Основные шаги, необходимые для этого, заключаются в следующем:

  1. Сохраните модели кодировщика и декодера в Keras

2. Преобразуйте модель Кераса в Tensorflow.js.

См. Эту ссылку для получения пошагового руководства по этому вопросу.

tensorflowjs_converter --input_format keras \
                       path/to/my_model.h5 \
                       path/to/tfjs_target_dir

3. Создайте веб-страницу: См. Ссылку для кода для загрузки набора данных MNIST в javascript. Создайте простую веб-страницу, которая генерирует 2 случайных изображения и использует ползунок для генерации интерполяции с использованием моделей кодировщика и декодера tensorflow.js.

Все коды и модели для веб-сервиса можно посмотреть на странице github.

Я попытался реализовать шаблон MVC, чтобы дать некоторое подобие порядка в наспех реализованном беспорядке кода.

Результаты

Барабанная дробь…..

Просмотрите эту ссылку, чтобы поиграть с ней самостоятельно.

БОНУС:

Если вы зашли так далеко, то мой подарок вам: ленивая реализация реализации скрытого пространства на лицах. Коды и результаты здесь.

Плечи гигантов:

  1. Https://hackernoon.com/latent-space-visualization-deep-learning-bits-2-bd09a46920df
  2. Thiemeyyah
  3. Https://github.com/akshaybahadur21/FaceEncoder
  4. Https://www.tensorflow.org/js/tutorials
  5. Https://blog.keras.io/building-autoencoders-in-keras.html