120 практических задач. Джейд Картер

Читать онлайн.
Название 120 практических задач
Автор произведения Джейд Картер
Жанр
Серия
Издательство
Год выпуска 2024
isbn



Скачать книгу

tensorflow.keras import layers, models

      import numpy as np

      import matplotlib.pyplot as plt

      # Шаг 1: Импорт библиотек

      import tensorflow as tf

      from tensorflow.keras import layers, models

      import numpy as np

      import matplotlib.pyplot as plt

      # Шаг 2: Подготовка данных

      # Загрузка набора данных MNIST

      (train_images, _), (_, _) = tf.keras.datasets.mnist.load_data()

      train_images = train_images.reshape(train_images.shape[0], 28, 28, 1).astype('float32')

      train_images = (train_images – 127.5) / 127.5 # Нормализация изображений в диапазоне [-1, 1]

      BUFFER_SIZE = 60000

      BATCH_SIZE = 256

      # Создание выборок

      train_dataset = tf.data.Dataset.from_tensor_slices(train_images).shuffle(BUFFER_SIZE).batch(BATCH_SIZE)

      # Шаг 3: Построение генератора

      def build_generator():

      model = models.Sequential()

      model.add(layers.Dense(7 * 7 * 256, use_bias=False, input_shape=(100,)))

      model.add(layers.BatchNormalization())

      model.add(layers.LeakyReLU())

      model.add(layers.Reshape((7, 7, 256)))

      assert model.output_shape == (None, 7, 7, 256) # Убедитесь, что выходная форма такая

      model.add(layers.Conv2DTranspose(128, (5, 5), strides=(1, 1), padding='same', use_bias=False))

      model.add(layers.BatchNormalization())

      model.add(layers.LeakyReLU())

      model.add(layers.Conv2DTranspose(64, (5, 5), strides=(2, 2), padding='same', use_bias=False))

      model.add(layers.BatchNormalization())

      model.add(layers.LeakyReLU())

      model.add(layers.Conv2DTranspose(1, (5, 5), strides=(2, 2), padding='same', use_bias=False, activation='tanh'))

      assert model.output_shape == (None, 28, 28, 1)

      return model

      # Шаг 4: Построение дискриминатора

      def build_discriminator():

      model = models.Sequential()

      model.add(layers.Conv2D(64, (5, 5), strides=(2, 2), padding='same', input_shape=[28, 28, 1]))

      model.add(layers.LeakyReLU())

      model.add(layers.Dropout(0.3))

      model.add(layers.Conv2D(128, (5, 5), strides=(2, 2), padding='same'))

      model.add(layers.LeakyReLU())

      model.add(layers.Dropout(0.3))

      model.add(layers.Flatten())

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

      return model

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

      generator = build_generator()

      discriminator = build_discriminator()

      # Определение функции потерь и оптимизаторов

      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(1e-4)

      discriminator_optimizer = tf.keras.optimizers.Adam(1e-4)

      # Шаг 5: Построение GAN

      @tf.function

      def train_step(images):

      noise = tf.random.normal([BATCH_SIZE, 100])

      with tf.GradientTape() as gen_tape, tf.GradientTape() as disc_tape:

      generated_images = generator(noise, training=True)

      real_output = discriminator(images, training=True)

      fake_output = discriminator(generated_images, training=True)

      gen_loss = generator_loss(fake_output)

      disc_loss = discriminator_loss(real_output, fake_output)

      gradients_of_generator = gen_tape.gradient(gen_loss, generator.trainable_variables)

      gradients_of_discriminator = disc_tape.gradient(disc_loss, discriminator.trainable_variables)

      generator_optimizer.apply_gradients(zip(gradients_of_generator, generator.trainable_variables))

      discriminator_optimizer.apply_gradients(zip(gradients_of_discriminator, discriminator.trainable_variables))

      def train(dataset, epochs):

      for epoch in range(epochs):

      for image_batch in dataset:

      train_step(image_batch)

      print(f'Эпоха {epoch + 1} завершена')

      # Шаг 6: Обучение GAN

      EPOCHS = 50

      train(train_dataset, EPOCHS)

      # Шаг 7: Генерация изображений

      def generate_and_save_images(model, epoch, test_input):

      predictions = model(test_input, training=False)

      fig = plt.figure(figsize=(4, 4))

      for i in range(predictions.shape[0]):

      plt.subplot(4, 4, i+1)

      plt.imshow(predictions[i, :, :, 0] * 127.5 + 127.5, cmap='gray')

      plt.axis('off')

      plt.savefig(f'image_at_epoch_{epoch:04d}.png')

      plt.show()

      # Генерация изображений после обучения

      noise = tf.random.normal([16, 100])

      generate_and_save_images(generator, EPOCHS, noise)

      ```

      Пояснение:

      1. Импорт библиотек: Импортируются необходимые библиотеки TensorFlow, Keras, numpy и matplotlib.

      2. Подготовка данных: Загружаются данные MNIST и нормализуются в диапазоне [-1, 1]. Данные затем разделяются на батчи для обучения.

      3. Построение генератора:

      – Генератор