텐서플로우는 구글이 개발한 딥러닝 프레임워크로, 인공지능 모델을 쉽게 구현할 수 있도록 해줍니다. 이 예시 프로그램은 텐서플로우를 이용하여 인공지능 작가를 만드는 방법을 보여줍니다.
텐서플로우를 이용하여 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)의 일종으로, 텍스트 데이터와 같은 시퀀스 데이터를 다룰 때 효과적입니다.
모델이 학습된 후, 생성된 텍스트를 만들어내는 함수를 정의합니다. 이 함수는 모델과 시작 문자열을 인자로 받아서, 시작 문자열을 기반으로 새로운 텍스트를 생성합니다.