생성 AI란? 샘플코드와 함께

2023.04.09 16:14 1,038 조회

생성 AI는 인공지능을 이용해 새로운 데이터를 생성하는 기술입니다.

그중 가장 널리 알려진 생성 AI 기술은 생성적 적대 신경망(GAN, Generative Adversarial Networks)입니다.

GAN은 생성자(Generator)와 판별자(Discriminator)라는 두 개의 인공신경망이 경쟁하면서 학습합니다.

생성자는 가짜 데이터를 생성하고, 판별자는 실제 데이터와 가짜 데이터를 구분하는 역할을 합니다. 이 과정을 통해 생성자는 점차 더 정교한 가짜 데이터를 생성하게 되며, 판별자는 더 정확하게 데이터를 구분하게 됩니다. 최종적으로는 생성자가 실제와 거의 구분이 불가능한 가짜 데이터를 생성하게 됩니다.

다음은 간단한 GAN 예제로, MNIST 데이터셋의 손글씨 숫자를 생성하는 코드입니다.


import tensorflow as tf
from tensorflow.keras.layers import Dense, LeakyReLU, Reshape, Conv2DTranspose, Conv2D, Flatten
from tensorflow.keras.models import Sequential
import numpy as np
import matplotlib.pyplot as plt

# 데이터 불러오기 및 전처리
(X_train, _), (_, _) = tf.keras.datasets.mnist.load_data()
X_train = X_train.astype(np.float32) / 255.
X_train = np.expand_dims(X_train, -1)

# 생성자 및 판별자 모델 정의
def build_generator(latent_dim):
  model = Sequential([
    Dense(7 * 7 * 256, input_dim=latent_dim),
    LeakyReLU(alpha=0.2),
    Reshape((7, 7, 256)),
    Conv2DTranspose(128, (4, 4), strides=(2, 2), padding='same'),
    LeakyReLU(alpha=0.2),
    Conv2DTranspose(128, (4, 4), strides=(2, 2), padding='same'),
    LeakyReLU(alpha=0.2),
    Conv2D(1, (7, 7), padding='same', activation='sigmoid')
  ])
  return model

def build_discriminator():
  model = Sequential([
    Conv2D(64, (3, 3), strides=(2, 2), padding='same', input_shape=(28, 28, 1)),
    LeakyReLU(alpha=0.2),
    Conv2D(128, (3, 3), strides=(2, 2), padding='same'),
    LeakyReLU(alpha=0.2),
    Flatten(),
    Dense(1, activation='sigmoid')
  ])
  return model

# 하이퍼파라미터 설정
epochs = 100
batch_size = 256
latent_dim = 100

# 모델 생성
generator = build_generator(latent_dim)
discriminator = build_discriminator()

# 생성자 및 판별자 모델 컴파일
discriminator.compile(optimizer=tf.keras.optimizers.Adam(0.0002), loss='binary_crossentropy', metrics=['accuracy'])
discriminator.trainable = False

gan_input = tf.keras.Input(shape=(latent_dim,))
gan_output = discriminator(generator(gan_input))
gan = tf.keras.Model(gan_input, gan_output)
gan.compile(optimizer=tf.keras.optimizers.Adam(0.0002), loss='binary_crossentropy')

GAN 학습 함수 정의

def train_gan(epochs, batch_size, latent_dim):
real_labels = np.ones((batch_size, 1))
fake_labels = np.zeros((batch_size, 1))

for epoch in range(epochs):
    # 실제 데이터에서 무작위로 배치 선택
    idx = np.random.randint(0, X_train.shape[0], batch_size)
    real_images = X_train[idx]


    # 생성자를 사용하여 노이즈로부터 가짜 이미지 생성
    noise = np.random.normal(0, 1, (batch_size, latent_dim))
    fake_images = generator.predict(noise)


    # 판별자를 학습시키기 위한 실제 이미지 및 가짜 이미지 사용
    real_loss, real_acc = discriminator.train_on_batch(real_images, real_labels)
    fake_loss, fake_acc = discriminator.train_on_batch(fake_images, fake_labels)
    d_loss, d_acc = 0.5 * np.add(real_loss, fake_loss), 0.5 * np.add(real_acc, fake_acc)


    # 생성자 학습
    noise = np.random.normal(0, 1, (batch_size, latent_dim))
    g_loss = gan.train_on_batch(noise, real_labels)


    # 학습 과정 출력
    if (epoch + 1) % 10 == 0:
        print(f"Epoch: {epoch + 1}, D Loss: {d_loss:.4f}, D Acc: {d_acc:.4f}, G Loss: {g_loss:.4f}")

GAN 학습

train_gan(epochs, batch_size, latent_dim)

생성된 이미지 확인

def show_generated_images(n):
        noise = np.random.normal(0, 1, (n, latent_dim))
        generated_images = generator.predict(noise)
        fig, axes = plt.subplots(1, n, figsize=(n, 1))
        for i, image in enumerate(generated_images):
            axes[i].imshow(image.reshape(28, 28), cmap='gray')
            axes[i].axis('off')
        plt.show()
        
show_generated_images(10)


이 코드는 간단한 GAN을 구현하여 MNIST 데이터셋의 손글씨 숫자를 생성하는 예제입니다. 학습 과정을 거친 후, 생성된 손글씨 숫자 이미지를 확인할 수 있습니다.


학생들이 이러한 예제를 통해 생성 AI의 원리와 GAN에 대해 이해하게 되면, 인공지능 기술의 다양한 활용 방안에 대해 더욱 흥미를 가질 수 있을 것입니다.

이를 바탕으로 학생들은 인공지능과 관련된 다양한 문제를 해결하고, 실제 산업 현장에서 적용 가능한 능력을 기를 수 있습니다.