🤖 Глубокое обучение

Раскрашивание ч / б изображений с помощью GAN в TensorFlow

Эксперимент с GAN, раскрывающий их сверхспособности

Сегодня GAN - одна из самых интересных тем в машинном обучении. Они использовались в ряде задач (и не только для генерации цифр MNIST!) И работали очень хорошо в каждом случае. GAN (General Adversarial Network) состоит из генератора и дискриминатора, которые соревнуются друг с другом, чтобы получить потрясающие результаты. Здесь мы рассмотрим математический подход к пониманию GAN и его функций потерь. Поскольку идея обучения GAN исходит из теории игр, мы также кратко рассмотрим Стратегию минимаксной оптимизации.

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

«[GAN] - самая интересная идея в машинном обучении за последние десять лет» - Янн ЛеКун, директор Facebook AI.

У GAN есть одни из самых удивительных приложений, например превращение лошади в зебру, как показано ниже.

Вот базовая архитектура GAN, используемая для создания реалистичных человеческих лиц:

Эта история сможет дать вам лишь представление о том, как работают GAN, поскольку мы сосредоточимся больше на сценарии использования, а не на полном объяснении того, как работают GAN. Чтобы получить более подробные знания по теме, обратитесь к этим блогам:







Раньше я пробовал раскрашивать изображения с помощью автоэнкодеров, но результаты были не на должном уровне. На всем изображении появился один цвет с разными оттенками или оттенками. Посмотреть проект можно здесь.

Данные и код

Наш набор данных будет состоять из 3000 изображений RGB из разных областей (горы, леса, города и т. Д.). Вы можете скачать его здесь. В записной книжке Colab мы преобразуем эти изображения RGB в оттенки серого, используя PIL, который будет действовать как метки для нашей модели.

Реализацию этого проекта в TensorFlow можно найти в этом блокноте Colab.

Генератор

Первое, что потребуется нашему GAN, - это генератор. Этот генератор принимает изображение в оттенках серого или черно-белое и выводит изображение RGB. Наш генератор будет иметь структуру кодера-декодера с симметрично расположенными слоями, как в UNet.

  • Кодировщик берет изображение в градациях серого и создает его скрытое представление (также называемое представлением узкого места). Задача декодера - создать изображение RGB путем увеличения этого скрытого представления. Этот подход используется большинством автокодировщиков, а также другими структурами кодировщика-декодера.
  • При построении изображения RGB из скрытого представления могут отсутствовать некоторые более мелкие детали. Было бы интересно наблюдать за результатами, если бы информация могла поступать напрямую от кодера к декодеру. Вот тут-то и на сцену выходят пропуски соединений.
  • Пропускные соединения переносят выходные данные сверточного слоя (присутствующего в кодировщике) в декодер, где они объединяются с предыдущими выходными данными самого декодера.
  • Вы можете наблюдать пропуски соединений в строках 28, 33 и 38 в приведенном выше фрагменте.

Дискриминатор

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

Математика

Я знаю, что математика становится пугающей, особенно в машинном обучении, но не беспокойтесь, я постараюсь сделать все как можно проще. Предположим, у нас есть образец (x, y) из нашего набора данных. Здесь x будет представлять изображение в оттенках серого, а y будет тем же изображением, но с цветами, то есть в формате RGB. Формы x и y показаны ниже.

Мы представляем генератор как G, а дискриминатор как D. Для одного шага мы запустим генератор один раз, а дискриминатор дважды.

Здесь y_p представляет сгенерированное изображение. P (real | y) - это вероятность того, что данное изображение y является одним из данных. Здесь «реальный» означает, что изображение не создается.

Мы можем рассматривать y как реальное и y_p как сгенерированное / поддельное изображение из генератора. Мы можем использовать эту терминологию, как вы найдете в большинстве ресурсов, посвященных GAN.

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

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

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

  • Минимакс относится к стратегии оптимизации в пошаговых играх для двух игроков для минимизации потерь или затрат в худшем случае для другого игрока. Здесь наш генератор и дискриминатор - это два игрока, соревнующихся друг с другом.
  • Для дискриминатора максимизация потерь будет означать точную классификацию сгенерированных изображений (y_p), а также получение хорошей вероятности (близкой к 1,0) для изображений (y) из набора данных .

  • Генератор, минимизируя свои потери, улучшается до такой степени, что может обмануть дискриминатор. Обман дискриминатора означает, что дискриминатор будет генерировать вероятности (близкие к 1,0) даже для сгенерированных изображений (y_p).

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

Если дискриминатор достаточно «умный», он будет выдавать вероятности, близкие к 1,0 для реальных изображений (взятых из нашего набора данных). Итак, мы обучаем наш генератор подделывать такие реалистичные изображения, которые сделают выходные вероятности дискриминатора ближе к 1,0, даже когда изображения подделаны (не из нашего набора данных, а из генератора).

Наша окончательная функция потерь будет:

Это все! Теперь перейдем к коду для обучения GAN.

Код

Мы видели реализацию генератора и дискриминатора в Keras во фрагментах 1 и 2. Теперь давайте посмотрим на реализацию функций потерь.

Заметили что-то другое в приведенном выше фрагменте, в строках 5 и 6?

Мы добавляем / вычитаем небольшие случайные значения из tf.ones и tf.zeros. Таким образом, вместо использования жестких меток, таких как единицы и нули, мы используем зашумленные метки, такие как 0,12 или 0,99. Это помогает дискриминатору лучше учиться, иначе он приблизится к 1 или 0 в начальные эпохи, и никакого обучения не произойдет.



Мы используем Оптимизатор Адама как для генератора, так и для дискриминатора со скоростью обучения 0,001.

Далее следует цикл обучения. Цикл обучения будет генерировать прогнозы как от генератора, так и от дискриминатора, вычислять потери и оптимизировать обе модели.

Теперь мы готовы приступить к тренировкам. Значения потерь печатаются для каждого прямого прохода.

Результаты, достижения

Результаты неплохие и демонстрируют удивительную мощь GAN. Но вы увидите некоторые нарушения (черные / желтые пятна, отличные от фона) на изображениях ниже.

Мы также получили несколько удивительных результатов, в которых дневное время было преобразовано в вечернее - мы не тренировали модель для этого!

Заключение

Действительно, GAN могут изменить лицо машинного обучения. Как я уже говорил ранее, они гибкие и могут использоваться для решения различных задач. Хотите знать, где еще мы можем использовать GAN?

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

GAN (точнее, CycleGAN) могут даже создавать человеческие картины и произведения искусства, как показано ниже.

Если вам понравился этот блог, подумайте о дальнейшем чтении как по машинному обучению в целом, так и по Android.

Если у вас есть больше идей о том, как мы можем улучшить эту GAN, чтобы добиться лучших результатов, не забудьте оставить их в комментариях ниже! Спасибо и желаю вам прекрасного пути к ML.

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

Независимо от редакции, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить модели машинного обучения.