Нейросети. Генерация изображений. Джейд Картер

Читать онлайн.
Название Нейросети. Генерация изображений
Автор произведения Джейд Картер
Жанр
Серия
Издательство
Год выпуска 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,