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

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

Во-первых, я написал пару GAN для сэмплов из MNIST, используя только полностью связанные слои. На самом деле образцы оказались довольно красивыми. Затем я попытался построить ту же архитектуру для образца Cifar10, и было невероятно сложно придумать гиперпараметры для обучения хотя бы очень шумных и плохо выглядящих изображений. Следовательно, подход DCGAN - лучший способ работать с 3 (или более) канальными изображениями.

Я использовал статью Обучение представлению без учителя с помощью глубоких сверточных генерирующих состязательных сетей (https://arxiv.org/abs/1511.06434 »), чтобы установить свои гиперпараметры. Этот документ обычно упоминается по этому поводу.

Кроме того, я использовал TensorFlow (1.0) для построения сети, хотя я не делал для нее никакой оптимизации производительности. Я запускаю TF 1.0 в облаке AWS с графическим процессором NVIDIA K80.

Импорт

Вот библиотеки, которые участвуют в построении DCGAN. Это все довольно простые вещи.

  • TensorFlow используется для построения и выполнения вычислительного графа.
  • Набор данных Cifar10 импортируется через модуль наборов данных Keras.
  • Matplotlib используется для построения графиков потерь и проверки изображений.
  • Numpy, ну, это глупо.
  • tqdm используется для вывода прогресса обучения

Аппаратное обеспечение

Вот графический процессор, на котором я тренируюсь (NVIDIA K80). На данный момент это не лучший графический процессор на рынке, но он довольно мощный и выполняет свою работу.

Импорт данных

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

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

Генератор

Цель генератора - взять массив некоторого шума, в данном случае однородный шум, и преобразовать его в изображение (или объем 32x32x3). На первых итерациях мы получим чистый шум на выходе генератора, но в дальнейшем, когда генератор будет учиться у дискриминатора, мы увидим несколько потрясающих изображений, которые будут похожи на изображения из нашего обучающего набора.

  • Ядро генератора инициализируется унифицированным инициализатором Xavier: http://proceedings.mlr.press/v9/glorot10a/glorot10a.pdf
  • Поле восприятия имеет размер 5 (оба измерения).
  • Шаг 2-го размера.
  • Заполнение "такое же"
  • Наклон негерметичного ReLU составляет 0,2
  • Мы начинаем с плотной карты от 100 до 1024 и преобразуем 1024 узла в объем 2x2x256.
  • Мы применяем пакетную нормализацию на каждом уровне сети, чтобы помочь сети учиться. Https://arxiv.org/pdf/1502.03167.pdf
  • Мы применяем функцию активации утечки relu ко всем слоям, кроме последнего.
  • На последнем слое мы применяем функцию активации гиперкасанса, чтобы получить изображение 3 каналов со значениями пикселей от -1 до 1.

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

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

  • Дискриминатор - это базовая CNN
  • Мы не используем пакетную нормализацию на первом уровне дискриминатора.
  • Нет максимальных или каких-либо других уровней пула для понижающей дискретизации.
  • Инициализатор Xavier используется для ядра
  • Поле восприятия имеет размер 5
  • Шаг 2-го размера.
  • Заполнение "такое же"
  • Leaky ReLU используется как функция активации на каждом уровне, но не на последнем.
  • Стандартная сигмоидальная активация используется на выходе сети для определения вероятности того, что изображение сгенерировано.

Оптимизация

Потери и оптимизаторы тоже довольно просты.

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

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

Тренироваться

После того, как мы построили сеть, мы можем продолжить и обучать ее.

  • Размер пакета установлен на 128
  • Мы тренируемся на 100 эпох. Однако толковые образцы мы получаем уже после 10-й эпохи.

Некоторые образцы

Полный код доступен по адресу: https://github.com/halahup/Machine-Learning/tree/master/DCGAN/Cifar10