Open danbi5228 opened 11 months ago
assign roles -s 1115 -c 1 2 3
0 | 1 | 2 | |
---|---|---|---|
member | 김유리 | 한단비 | 주선미 |
chapter | 1 | 2 | 3 |
보통 훈련 세트는 백만 개 이상의 글자로 이루어진 시퀀스
window() 메서드를 이용해서 이 긴 시퀀스를 작은 많은 텍스트 윈도로 변환
데이터셋의 각 샘플은 전체 텍스트에서 매우 짧은 부분 문자열
RNN은 이 부분 문자열 길이만큼 역전파를 위해 펼쳐짐, 이를 TBPTT (Truncated Backpropagation Through Time)라고 부름
n_steps = 100
window_length = n_steps + 1 # target = 1 글자 앞의 input
dataset = dataset.window(window_length, shift=1, drop_remainder=True)
첫 번째 윈도는 0-100번째 글자 포함, 두 번째 윈도는 1-101번째 글자 포함하는 식
window()는 리스트(전체)의 리스트(부분)와 비슷한, 중첩 데이터셋 형태
그러나 모델은 데이터셋이 아니라 텐서를 기대하기 때문에 훈련에 중첩 데이터셋을 바로 사용할 수는 없음
flat_map()을 호출해서 플랫 데이터셋으로 변경 필요
그리고 윈도마다 batch(window_length)를 호출해서, 윈도를 배치로 만들고
윈도마다 입력(처음 100개 글자)과 타겟(마지막 글자)를 분리
# 셰익스피어 작품 모두 다운로드
shakespeare_url = "https://homl.info/shakespeare"
filepath = keras.utils.get_file("shakespeare.txt", shakespeare_url)
with open(filepath) as f:
shakespeare_text = f.read()
tokenizer = keras.preprocessing.text.Tokenizer(char_level=True) # 글자 수준 인코딩
tokenizer.fit_on_texts(shakespeare_text)
>>> tokenizer.texts_to_sequences(["First"])
>>> tokenizer.sequences_to_texts([[20,6,9,8,3]])
>>> max_id = len(tokenizer.word_index) # 고유 글자 개수
>>> dataset_size = tokenizer.document_count # 전체 글자 개수
# 전체 텍스트를 인코딩
[encoded] = np.array(tokenizer.texts_to_sequences([shakespeare_text])) - 1
train_size = dataset_size * 900 // 100
dataset = tf.data.Dataset.from_tensor_slices(encoded[:train_size]) # 한 번에 한 글자씩 반환하는 객체