Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шолле Ф. - Глубокое обучение на Python (Библиотека программиста) - 2023.pdf
Скачиваний:
11
Добавлен:
07.04.2024
Размер:
11.34 Mб
Скачать

12.5. Введение в генеративно-состязательные сети     497

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

.Разреженные.градиенты.могут.препятствовать.обучению.GAN..В.глубоком. обучении.разреженность.часто.является.желательным.свойством,.но.не.в.случае .с .GAN..Разреженность .градиента .могут .вызывать .операции .выбора. максимального.значения.по.соседним.элементам.(max.pooling).и.активации. relu..Вместо.выбора.максимального.значения.для.уменьшения.разрешения. я.рекомендую.увеличивать.шаг.свертки,.а.вместо.функции.активации.relu . использовать.слой.LeakyReLU..Он.напоминает.relu,.но.ослабляет.ограничение. разреженности,.допуская.небольшие.отрицательные.значения.активации.

.В .сгенерированных .изображениях .часто .наблюдаются .артефакты .типа. «шахматная.доска»,.обусловленные.неравномерным.охватом.пространства. пикселей.в.генераторе.(рис..12.21)..Для.их.устранения.мы.будем.выбирать. размер.ядра,.кратный.размеру.шага,.при.каждом.использовании.разреженных. слоев.Conv2DTranpose .или.Conv2D .в.генераторе.и.дискриминаторе.

Рис. 12.21. Артефакты типа «шахматная доска», вызванные несовпадением размеров шага и ядра, из-за чего происходит неравномерный охват пространства пикселей: одна из многих тонкостей GAN, доставляющих хлопоты

12.5.3. Получение набора данных CelebA

Загрузить.набор.данных.можно.вручную.с.веб-сайта.http://mmlab.ie.cuhk.edu.hk/ projects/CelebA.html..Если.вы.используете.Colab,.выполните.следующие.команды.—. они.загрузят.данные.с.Google.Drive.и.распакуют.их.

Листинг 12.30. Получение набора данных CelebA

 

 

Создать рабочий

 

 

!mkdir celeba_gan

 

каталог

 

 

 

 

 

 

 

!gdown --id 1O7m1010EJjLE5QxLZiM9Fpjs7Oj6e684 -O celeba_gan/data.zip

 

!unzip -qq celeba_gan/data.zip -d celeba_gan

 

Загрузить архив с данными

 

 

 

 

 

 

 

 

 

с помощью утилиты gdown

 

 

Распаковать

(по умолчанию доступна в Colab;

 

 

данные

если нет — установите ее)

498    Глава 12. Генеративное глубокое обучение

После.распаковки.изображений.в.каталог.можно.превратить.каталог.image_ dataset_from_directory .в.объект.набора.данных..Так.как.нам.нужны.только. изображения.—.без.меток,.—.передадим.аргумент.label_mode=None.

Листинг 12.31. Создание объекта набора данных на основе каталога с изображениями

from tensorflow import keras

dataset = keras.utils_dataset_from_directory(

"celeba_gan",

 

Возвращаться должны только

label_mode=None,

 

 

 

 

изображения, без меток

image_size=(64, 64),

 

 

 

batch_size=32,

 

Уменьшить размеры изображений до 64 × 64, используя

 

smart_resize=True)

 

 

комбинацию операций обрезки и масштабирования для сохранения

 

 

 

 

 

пропорций. Нам не нужно, чтобы пропорции лиц искажались!

Наконец,.масштабируем.значения,.представляющие.пиксели,.в.диапазон.[0–1].

Листинг 12.32. Масштабирование значений пикселей в изображениях

dataset = dataset.map(lambda x: x / 255.)

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

Листинг 12.33. Вывод на экран первого изображения

import matplotlib.pyplot as plt for x in dataset:

plt.axis("off")

plt.imshow((x.numpy() * 255).astype("int32")[0]) break

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

Теперь.перейдем.к.модели.дискриминатора,.которая.принимает.на.входе.изо- бражение-кандидат.(реальное.или.искусственное).и.относит.его.к.одному.из. двух.классов:.«подделка».или.«настоящее,.имеющееся.в.обучающем.наборе».. Одна.из.многих.проблем,.часто.возникающих.в.сетях.GAN,.—.генератор.создает. изображения,.которые.выглядят.как.шум..Одно.из.возможных.решений.—.ис- пользовать.прореживание.в.дискриминаторе,.что.мы.и.сделаем.здесь.

Листинг 12.34. Сеть дискриминатора в GAN

from tensorflow.keras import layers

discriminator = keras.Sequential(

[

12.5. Введение в генеративно-состязательные сети     499

keras.Input(shape=(64, 64, 3)),

 

layers.Conv2D(64, kernel_size=4, strides=2, padding="same"),

layers.LeakyReLU(alpha=0.2),

 

layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),

layers.LeakyReLU(alpha=0.2),

 

layers.Conv2D(128, kernel_size=4, strides=2, padding="same"),

layers.LeakyReLU(alpha=0.2),

Слой прореживания:

layers.Flatten(),

важная хитрость!

layers.Dropout(0.2),

 

 

 

layers.Dense(1, activation="sigmoid"),

],

name="discriminator",

)

Вот.сводная.информация.о.получившейся.модели.дискриминатора:

>>> discriminator.summary() Model: "discriminator"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

conv2d (Conv2D) (None, 32, 32, 64) 3136

_________________________________________________________________

leaky_re_lu (LeakyReLU) (None, 32, 32, 64) 0

_________________________________________________________________

conv2d_1 (Conv2D) (None, 16, 16, 128) 131200

_________________________________________________________________

leaky_re_lu_1 (LeakyReLU) (None, 16, 16, 128) 0

_________________________________________________________________

conv2d_2 (Conv2D) (None, 8, 8, 128) 262272

_________________________________________________________________

leaky_re_lu_2 (LeakyReLU) (None, 8, 8, 128) 0

_________________________________________________________________

flatten (Flatten) (None, 8192) 0

_________________________________________________________________

dropout (Dropout) (None, 8192) 0

_________________________________________________________________

dense (Dense) (None, 1) 8193

=================================================================

Total params: 404,801 Trainable params: 404,801 Non-trainable params: 0

_________________________________________________________________

12.5.5. Генератор

Затем.реализуем.модель.generator,.преобразующую.вектор.(из.скрытого.про- странства.—.во.время.обучения.он.будет.выбираться.случайно).в.изображение- кандидат.

500    Глава 12. Генеративное глубокое обучение

Листинг 12.35. Сеть генератора в GAN

 

 

 

 

Скрытое пространство будет

 

 

 

 

 

 

 

 

 

 

 

 

состоять из 128-мерных

 

 

 

 

 

 

 

 

latent_dim = 128

 

векторов

Произвести такое же

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

generator = keras.Sequential(

количество коэффициентов,

Использовать

 

 

 

 

 

как в слое Flatten

слой LeakyReLU

 

 

 

[

 

 

 

 

 

 

 

 

 

 

 

в кодировщике

в качестве

 

 

 

 

 

keras.Input(shape=(latent_dim,)),

 

 

 

 

 

 

Восстановить слой

функции

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

layers.Dense(8 * 8 * 128),

 

активации

 

 

 

 

 

 

Flatten кодировщика

 

 

 

 

 

layers.Reshape((8, 8, 128)),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding="same"),

 

 

 

 

 

 

 

layers.LeakyReLU(alpha=0.2),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding="same"),

 

 

 

 

 

 

layers.LeakyReLU(alpha=0.2),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding="same"),

 

 

 

 

 

 

 

layers.LeakyReLU(alpha=0.2),

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

layers.Conv2D(3, kernel_size=5, padding="same", activation="sigmoid"),

 

 

 

 

 

 

 

 

],

 

 

 

 

 

 

Выход будет иметь

 

 

 

 

name="generator",

 

 

 

 

 

 

)

 

 

 

 

 

 

 

 

форму (28, 28, 1)

 

 

 

 

 

 

 

 

 

 

Восстановить слой Conv2D кодировщика

Вот.сводная.информация.о.получившейся.модели.генератора:

>>> generator.summary() Model: "generator"

_________________________________________________________________

Layer (type) Output Shape Param #

=================================================================

dense_1 (Dense) (None, 8192) 1056768

_________________________________________________________________

reshape (Reshape) (None, 8, 8, 128) 0

_________________________________________________________________

conv2d_transpose (Conv2DTran (None, 16, 16, 128)

262272

_________________________________________________________________

leaky_re_lu_3 (LeakyReLU) (None, 16, 16, 128) 0

_________________________________________________________________

conv2d_transpose_1 (Conv2DTr (None, 32, 32, 256)

524544

_________________________________________________________________

leaky_re_lu_4 (LeakyReLU) (None, 32, 32, 256) 0

_________________________________________________________________

conv2d_transpose_2 (Conv2DTr (None, 64, 64, 512)

2097664

_________________________________________________________________

leaky_re_lu_5 (LeakyReLU) (None, 64, 64, 512) 0

_________________________________________________________________

conv2d_3 (Conv2D) (None, 64, 64, 3) 38403

=================================================================

Total params: 3,979,651 Trainable params: 3,979,651 Non-trainable params: 0

_________________________________________________________________