Генеративно-состязательная сеть

Генеративно-состязательная сеть (GAN) — это тип архитектуры глубокого обучения, состоящий из двух нейронных сетей: генератора и дискриминатора. Генератор обучен генерировать новые выборки данных, которые аналогичны заданному набору фактических выборок данных. Напротив, дискриминатор обучен различать сгенерированные выборки и настоящие выборки. Две сети тренируются в соревновании друг с другом, когда генератор пытается создать выборки, неотличимые от реальных выборок, а дискриминатор пытается правильно определить, является ли выборка реальной или сгенерированной.

Запустите код онлайн здесь

как реализовать GAN с помощью TensorFlow и генерировать поддельные табличные данные из реальных данных;

  • Определите модель генератора: Модель генератора — это нейронная сеть, которая принимает вектор случайного шума в качестве входных данных и генерирует выборку поддельных данных. В этом коде модель генератора определяется с помощью класса Sequential из TensorFlow и состоит из двух плотных слоев с активацией ReLU.
  • Определите модель дискриминатора. Модель дискриминатора — это еще одна нейронная сеть, которая принимает выборку реальных или сгенерированных данных в качестве входных данных и выводит скаляр, указывающий вероятность того, что выборка реальна. В этом коде модель дискриминатора также определяется с использованием класса Sequential из TensorFlow и состоит из двух плотных слоев с активацией ReLU, за которыми следует один плотный слой с сигмовидной активацией.
  • Задайте комбинированную модель: комбинированная модель используется для обучения генератора и состоит из генератора и дискриминатора, соединенных вместе. Модель генератора связана с моделью дискриминатора путем настройки дискриминатора как необучаемого, что означает, что градиенты от дискриминатора не используются для обновления его параметров во время обучения.
  • Загрузите реальные данные: код загружает реальные данные из файла .csv с помощью Pandas и преобразует их в массив Numpy.
  • Обучение GAN: GAN обучается с использованием цикла for, который поочередно обучает дискриминатор и генератор. На каждой итерации дискриминатор обучается на пакете реальных и сгенерированных данных с использованием distributor.train_on_batch(X, labels), где X — это конкатенация реальных данных и сгенерированных данных, а labels — это вектор, указывающий, является ли каждый образец реальным или сгенерировано. Затем генератор обучается с использованием метода comb.train_on_batch(noise, np.ones(batch_size)), где шум — это вектор случайного шума, а np.ones(batch_size) — это вектор из единиц с той же длиной, что и размер пакета. .
  • Создание поддельных выборок: после обучения GAN код генерирует поддельные выборки, вводя случайный шум в модель генератора с помощью генератора.predict(noise).
import os
import logging
import numpy as np
import pandas as pd
import tensorflow as tf

tf.get_logger().setLevel(logging.ERROR)


class Gan():

    def __init__(self, data):


        self.data = data
        self.n_epochs = 200

    # Genereta random noise in a latent space
    def _noise(self):
        noise = np.random.normal(0, 1, self.data.shape)
        return noise

    def _generator(self):
        model = tf.keras.Sequential(name="Generator_model")
        model.add(tf.keras.layers.Dense(15, activation='relu',
                                        kernel_initializer='he_uniform',
                                        input_dim=self.data.shape[1]))
        model.add(tf.keras.layers.Dense(30, activation='relu'))
        model.add(tf.keras.layers.Dense(
            self.data.shape[1], activation='linear'))
        return model

    def _discriminator(self):
        model = tf.keras.Sequential(name="Discriminator_model")
        model.add(tf.keras.layers.Dense(25, activation='relu',
                                        kernel_initializer='he_uniform',
                                        input_dim=self.data.shape[1]))
        model.add(tf.keras.layers.Dense(50, activation='relu'))
        # sigmoid => real or fake
        model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
        model.compile(loss='binary_crossentropy',
                      optimizer='adam',
                      metrics=['accuracy'])

        return model

    # define the combined generator and discriminator model,
    # for updating the generator
    def _GAN(self, generator, discriminator):
        discriminator.trainable = False
        generator.trainable = True
        model = tf.keras.Sequential(name="GAN")
        model.add(generator)
        model.add(discriminator)
        model.compile(loss='binary_crossentropy', optimizer='adam')
        return model

    # train the generator and discriminator
    def train(self, generator, discriminator, gan):

        # determine half the size of one batch, for updating the  discriminator
        # manually enumerate epochs
        for epoch in range(self.n_epochs):
            
            # Train the discriminator
            generated_data = generator.predict(self._noise())
            labels = np.concatenate([np.ones(self.data.shape[0]), np.zeros(self.data.shape[0])])
            X = np.concatenate([self.data, generated_data])
            discriminator.trainable = True
            d_loss , _ = discriminator.train_on_batch(X, labels)

            # Train the generator
            noise = self._noise()
            g_loss = gan.train_on_batch(noise, np.ones(self.data.shape[0]))


            print('>%d, d1=%.3f, d2=%.3f' %(epoch+1, d_loss, g_loss))

        return generator

Оценка качества

Оценка того, насколько хорошо GAN может генерировать новые данные, похожие на данные, на которых она обучалась. Качество можно оценить на основе различных показателей, таких как визуальное сходство, разнообразие и надежность сгенерированных данных. Цель состоит в том, чтобы определить, способна ли GAN генерировать высококачественные синтетические данные.

Заключение

Генеративно-состязательные сети (GAN) — это мощная архитектура глубокого обучения, которую можно использовать для создания новых выборок данных, похожих на заданный набор реальных выборок данных. GAN состоят из двух нейронных сетей: генератора и дискриминатора, которые состязательно обучены для получения реалистичных данных. Код, который я предоставил, является простым примером того, как реализовать GAN в TensorFlow и генерировать поддельные табличные данные из реальных данных.

https://samanemami.github.io/