Добавить в цитаты Настройки чтения

Страница 2 из 11



# Гиперпараметры

random_dim = 100

epochs = 10000

batch_size = 128

# Создание генератора

def build_generator():

model = tf.keras.Sequential()

model.add(layers.Dense(256, input_dim=random_dim))

model.add(layers.LeakyReLU(0.2))

model.add(layers.BatchNormalization())

model.add(layers.Dense(512))

model.add(layers.LeakyReLU(0.2))

model.add(layers.BatchNormalization())

model.add(layers.Dense(1024))

model.add(layers.LeakyReLU(0.2))

model.add(layers.BatchNormalization())

model.add(layers.Dense(784, activation='tanh'))

model.add(layers.Reshape((28, 28)))

return model

# Создание дискриминатора

def build_discriminator():

model = tf.keras.Sequential()

model.add(layers.Flatten(input_shape=(28, 28)))

model.add(layers.Dense(1024))

model.add(layers.LeakyReLU(0.2))

model.add(layers.Dense(512))

model.add(layers.LeakyReLU(0.2))

model.add(layers.Dense(256))

model.add(layers.LeakyReLU(0.2))

model.add(layers.Dense(1, activation='sigmoid'))

return model

# Функции потерь и оптимизаторы

cross_entropy = tf.keras.losses.BinaryCrossentropy(from_logits=True)

def discriminator_loss(real_output, fake_output):

real_loss = cross_entropy(tf.ones_like(real_output), real_output)

fake_loss = cross_entropy(tf.zeros_like(fake_output), fake_output)

total_loss = real_loss + fake_loss

return total_loss

def generator_loss(fake_output):

return cross_entropy(tf.ones_like(fake_output), fake_output)

generator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5)

discriminator_optimizer = tf.keras.optimizers.Adam(learning_rate=0.0002, beta_1=0.5)

# Создание генератора и дискриминатора

generator = build_generator()

discriminator = build_discriminator()

# Функция обучения GAN

def train_gan():

for epoch in range(epochs):

# Генерация случайных векторов из латентного пространства

noise = np.random.normal(0, 1, size=[batch_size, random_dim])

# Генерация сгенерированных изображений генератором

generated_images = generator(noise)

# Получение случайных реальных изображений из обучающего набора

image_batch = train_images[np.random.randint(0, train_images.shape[0], size=batch_size)]

# Сборка батча из реальных и сгенерированных изображений

X = np.concatenate([image_batch, generated_images])



# Создание векторов меток для реальных и сгенерированных изображений

y_dis = np.zeros(2 * batch_size)

y_dis[:batch_size] = 0.9 # односторонний мягкий ярлык для гладкости

# Обучение дискриминатора на батче

discriminator.trainable = True

d_loss = discriminator.train_on_batch(X, y_dis)

# Обучение генератора

noise = np.random.normal(0, 1, size=[batch_size, random_dim])

y_gen = np.ones(batch_size)

discriminator.trainable = False

g_loss = gan.train_on_batch(noise, y_gen)

if epoch % 100 == 0:

print(f"Epoch: {epoch}, Discriminator Loss: {d_loss}, Generator Loss: {g_loss}")

# Обучение GAN

gan = tf.keras.Sequential([generator, discriminator])

gan.compile(loss='binary_crossentropy', optimizer=generator_optimizer)

train_gan()

```

Код представляет собой простую реализацию генеративной сети (GAN) для генерации реалистичных изображений с использованием библиотек TensorFlow и Keras в Python. Давайте подробно опишем каждую часть кода:

1. Загрузка данных MNIST:

– Загружается набор данных MNIST с рукописными цифрами с помощью функции `tf.keras.datasets.mnist.load_data()`.

– Обучающие изображения сохраняются в переменной `train_images`, а метки классов (которые в данном случае не используются) – в переменной `_`.

– Изображения преобразуются в одномерный формат и нормализуются в диапазоне [-1, 1], чтобы облегчить обучение модели.

2. Определение гиперпараметров:

– `random_dim`: размерность входного шумового вектора (латентного пространства), который будет использоваться для генерации изображений.

– `epochs`: количество эпох обучения GAN.

– `batch_size`: размер батча, используемого для обучения на каждой итерации.

3. Создание генератора (`build_generator`):

– Генератор представляет собой нейронную сеть, которая принимает случайный шум или вектор из латентного пространства и генерирует синтетические изображения.

– В данном примере генератор состоит из полносвязных слоев с функцией активации LeakyReLU и слоями BatchNormalization для стабилизации обучения.

– Финальный слой генератора имеет функцию активации `tanh`, чтобы ограничить значения изображений в диапазоне [-1, 1].

4. Создание дискриминатора (`build_discriminator`):

– Дискриминатор представляет собой нейронную сеть, которая принимает изображения и классифицирует их на "реальные" (1) или "сгенерированные" (0).

– В данном примере дискриминатор также состоит из полносвязных слоев с функцией активации LeakyReLU.

– Финальный слой дискриминатора использует сигмоидную функцию активации для получения вероятности принадлежности изображения к классу "реальные".

5. Определение функций потерь и оптимизаторов:

– В данном примере используется функция потерь бинарной кросс-энтропии (`BinaryCrossentropy`).

– Оптимизаторы для генератора и дискриминатора – `Adam` с заданным коэффициентом обучения.

6. Обучение GAN (`train_gan`):

– На каждой итерации обучения:

– Генерируется случайный вектор шума из латентного пространства.

– Генератор создает синтетические изображения на основе этого шума.

– Из обучающего набора выбирается случайный батч реальных изображений.

– Собирается батч из реальных и сгенерированных изображений.

– Дискриминатор обучается на этом батче с метками "реальные" и "сгенерированные" соответственно.

– Генератор обучается на сгенерированном шуме с метками "реальные".

– Обучение происходит чередованием обучения дискриминатора и генератора, чтобы они соревновались друг с другом.

7. Обучение GAN:

– GAN собирается из генератора и дискриминатора в последовательную модель `gan`.

– Обучение GAN происходит вызовом метода `compile` с функцией потерь `binary_crossentropy` и оптимизатором `generator_optimizer`.

Обучение GAN (Generative Adversarial Network) представляет собой процесс обучения двух компонентов сети: генератора (Generator) и дискриминатора (Discriminator), взаимодействующих друг с другом в конкурентной игре.

Вначале создается последовательная модель GAN, объединяющая генератор и дискриминатор. Это делается путем последовательного объединения слоев генератора и слоев дискриминатора в единую модель. Это позволяет обращаться к генератору и дискриминатору как к единой сущности и проводить общую оптимизацию в процессе обучения.

 Для обучения GAN определяется функция потерь (loss function), которая определяет, насколько хорошо работает GAN. В случае GAN, функция потерь использует обычно бинарную кросс-энтропию (binary_crossentropy), которая является распространенным выбором для бинарных классификационных задач.

 Также выбирается оптимизатор (optimizer), который отвечает за обновление весов сети в процессе обучения с учетом значения функции потерь. В данном случае, указанный `generator_optimizer` используется для оптимизации параметров генератора.

Обучение GAN происходит чередованием двух основных этапов – обучение генератора и обучение дискриминатора. На каждом этапе происходит подача различных данных и обновление соответствующих параметров моделей. Главная идея заключается в том, что генератор стремится создать реалистичные данные, которые дискриминатор не сможет отличить от реальных, в то время как дискриминатор старается правильно классифицировать как реальные, так и сгенерированные данные.