1. 텍스트 뭉치 가져오기
import keras
import numpy as np
path = keras.utils.get_file(
'nietzsche.txt',
origin = 'https://s3.amazonaws.com/text-datasets/nietzsche.txt')
text = open(path).read().lower() ## 다 소문자로 바꿈
print('말뭉치 크기', len(text))
2. 약 60만개의 말뭉치를 원핫인코딩함 - 시간이 엄~~~~~~~~~~~~~청 오래걸림
maxlen = 60
step = 3
sentences = []
next_chars = []
for i in range(0, len(text) - maxlen, step) :
sentences.append(text[i: i+maxlen])
next_chars.append(text[i + maxlen])
print('시퀀스 개수', len(sentences))
chars = sorted(list(set(text)))
print('고유한 글자', len(chars))
char_indices = dict((char, chars.index(char)) for char in chars)
## 원핫인코딩
print('벡터화...')
x = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
for i, sentence in enumerate(sentences) :
for t, char in enumerate(sentence) :
x[i, t, char_indices[char]] = 1
y[i, char_indices[next_chars[i]]] = 1
print(sentences)
print(next_chars)
3. 모델 생성하기
from keras import layers
model = keras.models.Sequential()
model.add(layers.LSTM(128, input_shape=(maxlen, len(chars))))
model.add(layers.Dense(len(chars), activation='softmax'))
4. 옵티마이저 넣기
optimizer = keras.optimizers.RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)
5. 온도에 따른 샘플링위한 함수 (온도에 따라 가중치를 변화시킴)
def sample(preds, temperature=1.0) :
preds = np.asarray(preds).astype('float64')
preds = np.log(preds) / temperature
exp_preds = np.exp(preds)
preds = exp_preds / np.sum(exp_preds)
probas = np.random.multinomial(1, preds, 1)
return np.argmax(probas)
6.
- generated_text[1:] : 한글자씩 계속 쉬프트하면서 원핫인코딩을 함
import random
import sys
random.seed(42)
start_index = random.randint(0, len(text) - maxlen - 1)
for epoch in range(1,5): ## 60에서 5로 고쳤음
print('에포크', epoch)
model.fit(x, y, batch_size=128, epochs=1)
seed_text = text[start_index : start_index + maxlen]
print('---시드 텍스트 : "' + seed_text + '"')
for temperature in [0.2, 0.5, 1.0, 1.2]:
print('---- 온도 : ', temperature)
generated_text = seed_text
sys.stdout.write(generated_text)
for i in range(400) :
sampled = np.zeros((1, maxlen, len(chars)))
for t, char in enumerate(generated_text) :
sampled[0, t, char_indices[char]] = 1.
preds = model.predict(sampled, verbose=0)[0]
next_index = sample(preds, temperature)
next_char = chars[next_index]
generated_text += next_char
generated_text = generated_text[1:]
sys.stdout.write(next_char)
sys.stdout.flush()
print()
'딥러닝' 카테고리의 다른 글
0812 소프트맥스 회귀로 MNIST 데이터 분석하기 (0) | 2019.08.12 |
---|---|
0812 텐서플로 기초 (0) | 2019.08.12 |
0807 텍스트 데이터 다루기2 [모든 내용 적용하기] (0) | 2019.08.07 |
0807 17장 RNN [로이터 뉴스 카테고리 분류하기] (0) | 2019.08.07 |
0807 6장 텍스트 데이터 다루기 [Embedding층에 사용할 IMDB 데이터 로드하기] (0) | 2019.08.07 |