Объяснение внедрения DCGAN в Керасе

Недавно я начал читать статьи, связанные с GAN (Generative Adversarial Networks). Я восхищен этой новой революционной технологией в области компьютерного зрения. Чтобы глубже понять реализацию, я просматриваю код DCGAN (Deep Convolutional Generative Adversarial Networks).

Это код, который я пытаюсь понять:



Исходный документ DCGAN: https://arxiv.org/pdf/1511.06434.pdf

Это мое понимание реализации DCGAN в Керасе. Любой может поправить, если есть пробел в объяснении или моем понимании.

Код состоит из 6 основных блоков:

  1. Загрузить и подготовить набор данных
  2. Генератор
  3. Дискриминатор
  4. Потеря генератора / дискриминатора
  5. Оптимизатор
  6. Тренироваться

Загрузить и подготовить набор данных

Набор данных MNIST (рукописные цифры) используется для обучения модели. Это набор данных изображений, содержащий 60 000 обучающих примеров и 10 000 тестовых примеров рукописных цифр. Изображения в оттенках серого размером 28x28 пикселей. Значение каждого пикселя находится в диапазоне от 0 до 255, где 0 - черный, а 255 - белый фон.

Сначала изображения преобразуются в тензор формы (60000x28x28x1), а затем нормализуются для получения значений в диапазоне [-1,1].

train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')
train_images = (train_images - 127.5) / 127.5 # Normalize the images to [-1, 1]

Затем train_images (60,000) перемешиваются и группируются в пакеты размером 256.

train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

Генератор

Генератор принимает на вход вектор шума размером 100 и генерирует изображение размером 28x28x1.

Приведенная выше блок-схема дает подробный вид внутри генератора. Вектор шума z подается в полностью связанный слой со скрытыми элементами 7x7x256 (12544). Выход полностью подключенного слоя вводится в функцию активации Leaky ReLu и Пакетная нормализация.

Затем результат преобразуется в тензор размером 7x7x256. Это входные данные для Conv2DTranspose (повышающая дискретизация) со следующими функциями:

128 фильтров размером 5x5x256, с шагом (1,1), одинаковым заполнением * и смещением = 0

* "Same" padding сохраняет размер вывода таким же, как размер ввода, когда stride = (1,1).

Результатом этого блока является тензор размером 7x7x128. Затем он проходит через LeakyReLu и пакетную нормализацию. Затем вывод передается на другой Conv2DTranspose со следующими функциями:

64 фильтра размером 5x5x128, с (2,2) шагами, одинаковым заполнением и смещением = 0

Результатом этого блока является тензор размером 14x14x64.

Примечание. Формула для расчета выходного размера для разных шагов следующая:

для tf.layers.conv2d_transpose () с заполнением SAME:

out_height = in_height * шаги [1]

out_width = in_width * шагов [2]

Тензор 14x14x64 снова предоставляется в качестве входных данных для Leaky ReLu и Batch Normalization. Затем результат вводится в другой Conv2DTranspose со следующими функциями:

1 фильтр размером 5x5x64, с (2,2) шагами, одинаковым заполнением и смещением = 0

Выходной файл имеет размер 28x28x1. Это ввод для активации tanh для получения сгенерированного изображения.

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

Дискриминатор принимает на вход реальные и поддельные изображения и предсказывает, является ли изображение поддельным или настоящим. В идеале дискриминатор должен предсказывать 0 для поддельного изображения и 1 для реального изображения.

Изображение (сгенерированное / реальное) предоставляется в качестве входных данных для Conv2D со следующими функциями:

64 фильтра размером 5x5x1, (2,2) шага, одинаковые отступы и смещение = 0

Выходной сигнал (14x14x64) подается в функцию активации Leaky ReLu и пропадает со скоростью 0,3. Выходные данные из выпадающего списка передаются в другой Conv2D со следующими функциями:

128 фильтров размером 5x5x64, шаг (2,2), одинаковые отступы и смещение = 0

Выходные данные (7x7x128) подаются в Leaky ReLu и выпадают со скоростью 0,3, а затем сглаживаются в вектор размером 6272 (7x7x128 = 6272), который передается как вход для полностью подключенного слоя с одним скрытым блоком. Выход полностью подключенного слоя - это выход дискриминатора.

Потери генератора / дискриминатора

Оптимизатор

Для оптимизации используется Adam Optimizer со скоростью обучения 0,0001.

Поезд

• EPOCHS = 50

•Z = 100

• Размер пакета = 256

Для каждой эпохи:

Для каждого пакета (256 изображений) в изображениях (60K изображений):

  1. Создание векторов шума размером 100

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

3. Введите поддельные изображения в дискриминатор, чтобы получить fake_output

4. Введите реальные изображения в дискриминатор, чтобы получить real_output

5. Рассчитать потери генератора gen_loss

6. Вычислить потери дискриминатора disc_loss

7. Обновите градиенты, чтобы минимизировать потери

Просмотр этого кода позволил мне лучше понять DCGAN. Я надеюсь, что с помощью практики я стану еще лучше !!

Спасибо за прочтение :)

Ссылки:

Документ DCGAN: https://arxiv.org/pdf/1511.06434.pdf

Функции активации: https://towardsdatascience.com/activation-functions-neural-networks-1cbd9f8d91d6

Сверточная нейронная сеть: http://cs231n.github.io/convolutional-networks/

Оптимизатор Адама: https://arxiv.org/pdf/1412.6980.pdf