인공지능 작가 만들기

텐서플로우는 구글이 개발한 딥러닝 프레임워크로, 인공지능 모델을 쉽게 구현할 수 있도록 해줍니다. 이 예시 프로그램은 텐서플로우를 이용하여 인공지능 작가를 만드는 방법을 보여줍니다.
텐서플로우를 이용하여 LSTM(Long Short-Term Memory) 모델을 학습시켜 텍스트를 생성하는 예시 프로그램입니다. 이 예시 프로그램은 셰익스피어의 작품을 학습하여 새로운 텍스트를 생성합니다.

import tensorflow as tf
import numpy as np
import os
import time

# 데이터 로드
path_to_file = tf.keras.utils.get_file('shakespeare.txt', 'https://storage.googleapis.com/download.tensorflow.org/data/shakespeare.txt')
text = open(path_to_file, 'rb').read().decode(encoding='utf-8')

# 고유한 문자 수 계산
vocab = sorted(set(text))
vocab_size = len(vocab)

# 문자에서 숫자로 매핑
char_to_idx = {u:i for i, u in enumerate(vocab)}
idx_to_char = np.array(vocab)

text_as_int = np.array([char_to_idx[c] for c in text])

# 학습 데이터 생성
seq_length = 100
examples_per_epoch = len(text)//(seq_length+1)

char_dataset = tf.data.Dataset.from_tensor_slices(text_as_int)

sequences = char_dataset.batch(seq_length+1, drop_remainder=True)

def split_input_target(chunk):
    input_text = chunk[:-1]
    target_text = chunk[1:]
    return input_text, target_text

dataset = sequences.map(split_input_target)

BATCH_SIZE = 64
BUFFER_SIZE = 10000

dataset = dataset.shuffle(BUFFER_SIZE).batch(BATCH_SIZE, drop_remainder=True)

# 모델 생성
embedding_dim = 256
rnn_units = 1024

def build_model(vocab_size, embedding_dim, rnn_units, batch_size):
    model = tf.keras.Sequential([
        tf.keras.layers.Embedding(vocab_size, embedding_dim, batch_input_shape=[batch_size, None]),
        tf.keras.layers.LSTM(rnn_units, return_sequences=True, stateful=True, recurrent_initializer='glorot_uniform'),
        tf.keras.layers.Dense(vocab_size)
    ])
    return model

model = build_model(vocab_size, embedding_dim, rnn_units, BATCH_SIZE)

# 모델 컴파일
model.compile(optimizer='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True))

# 체크포인트 콜백 설정
checkpoint_dir = './training_checkpoints'
checkpoint_prefix = os.path.join(checkpoint_dir, "ckpt_{epoch}")

checkpoint_callback=tf.keras.callbacks.ModelCheckpoint(
    filepath=checkpoint_prefix,
    save_weights_only=True)

# 모델 학습
EPOCHS = 30

history = model.fit(dataset, epochs=EPOCHS, callbacks=[checkpoint_callback])

# 체크포인트로부터 가중치 복원
model = build_model(vocab_size, embedding_dim, rnn_units, batch_size=1)

model.load_weights(tf.train.latest_checkpoint(checkpoint_dir))

model.build(tf.TensorShape([1, None]))

# 텍스트 생성
def generate_text(model, start_string):
    num_generate = 1000

    input_eval = [char_to_idx[s] for s in start_string]
    input_eval = tf.expand_dims(input_eval, 0)

    text_generated = []
    temperature = 1.0

    model.reset_states()
    for i in range(num_generate):
        predictions = model(input_eval)
        predictions = tf.squeeze(predictions, 0)

        predictions = predictions / temperature
        predicted_id = tf.random.categorical(predictions, num_samples=1)[-1,0].numpy()

        input_eval = tf.expand_dims([predicted_id], 0)

        text_generated.append(idx_to_char[predicted_id])

    return (start_string + ''.join(text_generated))

먼저, 예시로 사용될 텍스트 데이터를 불러옵니다. 이번 예시에서는 ‘The Complete Works of William Shakespeare’이라는 셰익스피어의 작품 모음집을 사용합니다.

다음으로, 데이터 전처리를 수행합니다. 이 과정에서는 텍스트 데이터를 문자 단위로 분리하고, 각 문자를 숫자로 인코딩합니다. 이렇게 처리된 데이터는 모델이 학습할 수 있는 형태로 변환됩니다.

학습을 위한 모델은 LSTM(Long Short-Term Memory)을 사용합니다. LSTM은 순환 신경망(RNN)의 일종으로, 텍스트 데이터와 같은 시퀀스 데이터를 다룰 때 효과적입니다.

모델이 학습된 후, 생성된 텍스트를 만들어내는 함수를 정의합니다. 이 함수는 모델과 시작 문자열을 인자로 받아서, 시작 문자열을 기반으로 새로운 텍스트를 생성합니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다