Название | Нейросети. Генерация изображений |
---|---|
Автор произведения | Джейд Картер |
Жанр | |
Серия | |
Издательство | |
Год выпуска | 2023 |
isbn |
Применение GAN в генерации изображений позволяет создавать реалистичные портреты людей, синтезировать фотографии природы или архитектуры, а также анимации и многое другое. Это имеет широкий спектр применений, от развлекательной индустрии и рекламы до медицинского исследования и симуляции. GAN также используются для улучшения разрешения изображений, что может быть полезно в обработке медицинских снимков или улучшении качества видео.
Рассмотрим пример простой реализации GAN для генерации реалистичных изображений с помощью библиотеки TensorFlow и Keras в Python. Этот пример демонстрирует принцип работы GAN на основе простых полносвязных слоев. Он использует набор данных MNIST с рукописными цифрами.
```python
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers
# Загрузка данных MNIST
(train_images, _), (_, _) = tf.keras.datasets.mnist.load_data()
train_images = train_images.reshape(train_images.shape[0], 28 * 28).astype('float32')
train_images = (train_images – 127.5) / 127.5 # Нормализация данных в диапазоне [-1, 1]
# Гиперпараметры
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,