6-9 Character level Model RNN 데이터 입력 Architecture

codingart(66)
Published in
#kr
Words
386
Reading
2 min
Listen
Play
8y

batch_size, sequence_length, hidden_size 가 파라메터로 주어진 RNN을 코딩해 보자. 이 전 코딩에서는 일일이 데이터를 수작업으로 제시하고 숫자 class를 매긴 후 on hot code 설정하는 작업도 상당히 번거로우므로 깔끔하게 코딩을 통해 해결하도록 해보자.

아무래도 처음 시작부분에서 sample 이라는 문자열 변수에 문장의 일부를 입력해 주는 수고를 해야 한다. 이 sample에서 단어장을 만들기 위해 문자들을 뽑아낸다.
단어장이 철자별로 준비되면 문자 c의 순서별로 인덱스 i 를 looping 시켜 문자를 대응시켜 둔다. 이어서 문자열 변수 sample의 각 철자별로 순차적으로 looping 시키면서 숫자화 된 인덱스가 준비 되면 이로부터 리스트 형 x_data 와 y_data를 준비한다.

x_data[sample_idx[:-1]]에서 :-1은 0번부터 (n-1)번째 까지 즉 맨 마지막보다 하나 앞에 위치한 데이타까지를 뜻한다. 즉 “if you want you”에서 “if you want yo”까지가 된다. 반면에 1:는 첫 번째인 0번 다음부터인 1번부터 n번째까지를 뜻하며 “f you want you”가 된다.

noname01.png

TensorFlow 형식으로 RNN 코딩을 해보자. Session에서 데이터를 읽어 들일 수 있도록 placeholder X 와 Y를 준비하자. X placeholder 데이터로 one hot code를 준비한다. one hot code 의 자리 수는 num_classes 즉 부여되는 문자 class 수만큼으로 설정한다.

아래 그림에서처럼 이 코드에서 char2idx 와 sample_idx 사이에 코드 RNN 코드 실행에 필요한 모든 파라메터들을 선언하도록 하자.

noname02.png

BasicRNNCell이나 BasicLSTMCell 둘중에 하나가 준비되면 dymamic_rnn 에 입력하도록 한다.

아래에 첨부된 코드에서는 아직 placeholder 부분과 학습과 관련된 부분을 모조리 빼고 단지 맨 첫단계로서 랜덤 넘버가 입력된 상태를 간단히 출력해 보는 코드이다. 학습을 시키기 위해서는 빠진 부분을 보총해야 한다.
코드 다운 후 흐트러진 indentation을 바로 잡아 실행해 보기 바란다.

#cell_03

import tensorflow as tf
import numpy as np
tf.reset_default_graph()
tf.set_random_seed(777) # reproducibility

sample = " if you want you"
idx2char = list(set(sample)) # index -> char
char2idx = {c: i for i, c in enumerate(idx2char)} # char -> idex

hyper parameters

dic_size = len(char2idx) # RNN input size (one hot size)
hidden_size = len(char2idx) # RNN output size
num_classes = len(char2idx) # final output size (RNN or softmax, etc.)
batch_size = 1 # one sample data, one batch
sequence_length = len(sample) - 1 # number of lstm rollings (unit #)

sample_idx = [char2idx[c] for c in sample] # char to index
x_data = [sample_idx[:-1]] # X data sample (0 ~ n-1) hello: hell
y_data = [sample_idx[1:]] # Y label sample (1 ~ n) hello: ello

x_one_hot = tf.one_hot(x_data, num_classes) # one hot: 1 -> 0 1 0 0 0 0 0 0 0 0
cell = tf.contrib.rnn.BasicRNNCell(num_units=hidden_size)
outputs, _states = tf.nn.dynamic_rnn(cell, x_one_hot, dtype=tf.float32)

with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
print(outputs.eval())

마나마인로고.png

6-9 Character level Model RNN 데이터 입력 Architecture | Ecency