Объяснение внедрения DCGAN в Керасе
Недавно я начал читать статьи, связанные с GAN (Generative Adversarial Networks). Я восхищен этой новой революционной технологией в области компьютерного зрения. Чтобы глубже понять реализацию, я просматриваю код DCGAN (Deep Convolutional Generative Adversarial Networks).
Это код, который я пытаюсь понять:
Исходный документ DCGAN: https://arxiv.org/pdf/1511.06434.pdf
Это мое понимание реализации DCGAN в Керасе. Любой может поправить, если есть пробел в объяснении или моем понимании.
Код состоит из 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 изображений):
- Создание векторов шума размером 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