Нейросети. Генерация изображений
Шрифт:
Рассмотрим пример простой реализации 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 #
# Гиперпараметры
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 для стабилизации обучения.
Меняя маски
1. Унесенный ветром
Фантастика:
боевая фантастика
попаданцы
рейтинг книги
![Меняя маски](https://style.bubooker.vip/templ/izobr/no_img2.png)