[파이썬] Keras로 GANs 구현

GANs (Generative Adversarial Networks)는 최근 딥러닝 분야에서 많은 관심을 받고 있는 생성 모델입니다. 이 기술은 실제와 유사한 이미지나 데이터를 생성하는 능력을 가지고 있어, 예술 작품 생성, 데이터 증식 등 다양한 분야에서 응용되고 있습니다.

이 글에서는 Keras를 사용하여 GANs를 구현하는 방법을 알아보겠습니다. Keras는 간편하고 직관적인 API를 제공하여 딥러닝 모델을 쉽게 구축할 수 있는 프레임워크입니다.

GANs란?

GANs는 생성자(Generator)와 판별자(Discriminator)라는 두 개의 신경망으로 구성되어 있습니다. 생성자는 랜덤 노이즈를 입력으로 받아 가짜 데이터를 생성하고, 판별자는 실제 데이터와 생성자가 생성한 가짜 데이터를 입력으로 받아 구분하는 역할을 수행합니다. 생성자는 판별자를 속이는 방향으로 학습을 진행하고, 판별자는 생성자가 만든 가짜 데이터를 가려내는 방향으로 학습을 진행하게 됩니다. 이러한 학습과정은 생성자와 판별자 간의 경쟁적인 학습을 통해 최적화되는 과정입니다.

Keras를 사용한 GANs 구현

사전에 Keras를 설치해야 합니다. 아래 명령어를 사용하여 설치할 수 있습니다.

pip install keras

먼저 필요한 패키지와 데이터셋을 불러옵니다.

import numpy as np
import matplotlib.pyplot as plt
from keras.layers import Dense
from keras.models import Sequential
from keras.datasets import mnist

다음으로 생성자와 판별자를 정의합니다. 생성자는 랜덤 노이즈를 입력으로 받아 가짜 이미지를 생성하는 네트워크입니다. 판별자는 이미지를 입력으로 받아 실제 이미지인지 가짜 이미지인지 판별하는 네트워크입니다.

def build_generator(latent_dim):
    generator = Sequential()
    generator.add(Dense(128, input_dim=latent_dim, activation='relu'))
    generator.add(Dense(784, activation='tanh'))
    generator.compile(loss='binary_crossentropy', optimizer='adam')
    return generator

def build_discriminator():
    discriminator = Sequential()
    discriminator.add(Dense(128, input_dim=784, activation='relu'))
    discriminator.add(Dense(1, activation='sigmoid'))
    discriminator.compile(loss='binary_crossentropy', optimizer='adam')
    return discriminator

GAN 모델은 생성자와 판별자를 결합하여 학습합니다.

def build_gan(generator, discriminator):
    gan = Sequential()
    gan.add(generator)
    discriminator.trainable = False  # 판별자의 학습을 비활성화
    gan.add(discriminator)
    gan.compile(loss='binary_crossentropy', optimizer='adam')
    return gan

마지막으로 GAN 모델을 학습시키고 결과를 시각화하는 과정을 수행합니다.

def train_gan(gan, generator, discriminator, epochs, batch_size, latent_dim):
    (X_train, _), (_, _) = mnist.load_data()
    X_train = X_train / 255  # 이미지 데이터 정규화
    X_train = X_train.reshape(-1, 784)
    real = np.ones((batch_size, 1))
    fake = np.zeros((batch_size, 1))
    
    for epoch in range(epochs):
        idx = np.random.randint(0, X_train.shape[0], batch_size)
        real_imgs = X_train[idx]
        noise = np.random.normal(0, 1, (batch_size, latent_dim))
        
        fake_imgs = generator.predict(noise)
        
        # 판별자 학습
        d_loss_real = discriminator.train_on_batch(real_imgs, real)
        d_loss_fake = discriminator.train_on_batch(fake_imgs, fake)
        d_loss = 0.5 * np.add(d_loss_real, d_loss_fake)
        
        # 생성자 학습
        noise = np.random.normal(0, 1, (batch_size, latent_dim))
        g_loss = gan.train_on_batch(noise, real)
        
        if epoch % 100 == 0:
            print(f"Epoch: {epoch}, Discriminator Loss: {d_loss}, Generator Loss: {g_loss}")
            
    return

위의 코드를 실행하면 GAN 모델이 학습되며, 생성자가 실제와 유사한 이미지를 생성하게 됩니다. 이렇게 만들어진 이미지들을 확인하기 위해 matplotlib을 사용하여 시각화할 수 있습니다.

def generate_images(generator, latent_dim, n_samples):
    noise = np.random.normal(0, 1, (n_samples, latent_dim))
    generated_imgs = generator.predict(noise)
    
    plt.figure(figsize=(10, 10))
    for i in range(n_samples):
        img = generated_imgs[i].reshape(28, 28)
        plt.subplot(10, 10, i+1)
        plt.imshow(img, cmap='gray')
        plt.axis('off')
    plt.show()
    return

이제 위의 함수들을 호출하여 GAN 모델을 학습하고 결과를 확인할 수 있습니다.

latent_dim = 100
generator = build_generator(latent_dim)
discriminator = build_discriminator()
gan = build_gan(generator, discriminator)

train_gan(gan, generator, discriminator, epochs=10000, batch_size=128, latent_dim=100)
generate_images(generator, latent_dim, n_samples=100)

위의 예제 코드를 사용하여 Keras로 GANs를 구현할 수 있습니다. 이를 통해 직관적이고 간편한 방법으로 생성 모델을 구현하고 다양한 응용 분야에 활용할 수 있습니다.