DCGAN (Deep Convolutional Generative Adversarial Network)
DCGAN (Deep Convolutional Generative Adversarial Network) - генеративно-состязательные сети с использованием глубоких свёрточных сетей.
Официальная публикация: https://arxiv.org/abs/1511.06434
Системные требования
Использовались при разработке.
Для получения данных о видео карте использовалась утилита командной строки
nvidia-smi.
В процессе написания этого раздела состоялся переезд на:
- PyTorch 2.1.1+cu121
Среда разработки
- VSCodium 1.84.2 (VSCodium is a community-driven, freely-licensed binary distribution of Microsoft’s editor VS Code.)
- Jupyter v2023.9.100 Extension
Используемые библиотеки
- PyTorch - ML фреймворк.
- Torch info (torchsummary) - вывод подробной информации о структуре модели.
- NumPy - математический функции.
- Matplotlib - построение графиков.
Рекомендации по сборке
Обязательно укажите путь для сохранения набора данных в константе DATASET_ROOT. По умолчанию установлен путь актуальный для моей системы (z:\Home\Projects\dataset) и скорее всего вам не подойдёт.
Наборы данных используемые в примерах занимают порядка 4.4 Gb
- CELEBA - 4.3 Gb
- MNIST - 0.66 Gb
DCGAN MNIST
Время обучения: примерно десять минут.
dcgan-mnist.ipynb - генерация изображений рукописных цифр размером 28x28.
Сеть обучается на наборе данных MNIST (Modified National Institute of Standards and Technology).

DCGAN MNIST CONDITIONAL
Время обучения: примерно десять минут.
dcgan-mnist-conditional.ipynb - генерация изображений рукописных цифр размером 28x28 с указанием уточняющих признаков.
Сеть обучается на наборе данных MNIST (Modified National Institute of Standards and Technology).
В случае с набором MNIST уточняющим признаком является номер цифры от 0 до 9. Иначе говоря, мы можем указать, изображение какой именно цифры мы хотим сгенерировать.

DCGAN CELEBA
Время обучения: порядка двух часов.
dcgan-celeba.ipynb - генерация портретов знаменитостей размером 64х64.
Сеть обучается на наборе данных CELEBA (Large-scale CelebFaces Attributes (CelebA) Dataset).

Лирика
Генеративно-состязательные сети (GAN - Generative Adversarial Network) - это разновидность сетей задачей которых является генерация данных, обычно картинок.
Данные генерируются из шума (нормализованный шум Гауса) который задаётся в виде многомерного вектора, обычно называемого латентным вектором (latent vector), иногда обозначается буквой z.
Стоит отметить тот факт, что благодаря тому, что шум является нормализованным, генератор учится семплировать из области нормального распределения, что положительно сказывается на генеративных способностях сети.
Обучение
Для обучения генеративно состязательных сетей используется две нейронные сети: дискриминатор (discriminator) и генератор (generator).
Задача дискриминатора D - научится отличать настоящие данные от фальшивых, созданных генератором G.
Задача генератора G - научиться генерировать данные так, что бы дискриминатор на смог отличить их от настоящих.
Победить в этой битве не сможет никто, но в процессе этой “минимакс игры” генератор G учится делать достаточно качественные подделки.
Дискриминатор D принято обучать следующим образом:
-
Обучаем пакетом реальных данных (
real_data) говоря что в ответе должна быть единица (REAL_LABEL_VALUE = 1.0). Таким образом даём дискриминатору возможность быть строже к фальшивым данным. -
Обучаем пакетом фальшивых данных (
fake_data) созданных генератором из шума (noise). Меткой ответа является ноль (FAKE_LABEL_VALUE = 0.0).
Следующим шагом обучения, является обучение генератор G максимизируя log D(G(z)).
Здесь стоит отметить следующее.
Изначально предлагалось минимизировать log(1−D(G(z))), но это приводило к плохому обучению на старте, по этому было предложено максимизировать log D(G(z)). У такого подхода оказалось несколько плюсов:
-
Удалось снизить пагубное влияние затухание градиента.
-
Оказалось возможным использовать функцию бинарной кросс-энтропии (
nn.BCELoss).
В результате сегодня все используют максимизацию log D(G(z)).
Выводы
DCGAN является одной из ранних вариаций генеративных сетей, и по сути отличается от обычного GAN только тем, что использует свёрточные сети. Ждать от такой сети чего-то невероятного не приходится, но результат интересный, и стоит потраченного времени на изучение.
Куда двигаться дальше
Порядок генерирующих изображения GANов для изучения известных мне на момент написания этих строк (14.12.2023)
GAN- оригинальная идея,DCGAN- GAN с применением глубоких свёрточных сетей. (рассматривается тут)WGAN(Wasserstein GAN) - GAN с применением дистанции Вассерштейна.WGAN-GP(Wasserstein GAN with Grand Penalty) - WGAN со штрафом градиента.PGGAN- Методология обучения генеративных сетей с поэтапным увеличением разрешения изображения от малого до большого. Позволяет получить генерации высокого качества и разрешения. Под капотом используется WGAN-GP, так как по мнению авторов показывает лучшие результаты при обучении.StyleGAN- как утверждается, лидер по качеству генерации. Работает с использованием метода переноса стиля AdaIN. По моему мнению, это уже больше чем простая генеративно состязательная сеть, так как начала обрастать элементам из других областей машинного обучения.