분석시각화 대회 코드 공유 게시물은
내용 확인 후
좋아요(투표) 가능합니다.
생성 AI란? 샘플코드와 함께
생성 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에 대해 이해하게 되면, 인공지능 기술의 다양한 활용 방안에 대해 더욱 흥미를 가질 수 있을 것입니다.
이를 바탕으로 학생들은 인공지능과 관련된 다양한 문제를 해결하고, 실제 산업 현장에서 적용 가능한 능력을 기를 수 있습니다.
데이콘(주) | 대표 김국진 | 699-81-01021
통신판매업 신고번호: 제 2021-서울영등포-1704호
서울특별시 영등포구 은행로 3 익스콘벤처타워 901호
이메일 dacon@dacon.io | 전화번호: 070-4102-0545
Copyright ⓒ DACON Inc. All rights reserved