피곤핑
코딩일탈
피곤핑
전체 방문자
오늘
어제
  • 분류 전체보기
    • Kotlin & Java
    • Spring
      • Spring Security
      • Spring
    • 네트워크
    • JavaScript & Node js
    • Docker
    • Python3
    • Unity
    • 딥러닝
    • 객체지향프로그래밍
    • Error 보고서
    • 나의 이야기 & 회고
    • HTML & CSS
    • Archive
    • 독서

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

  • JavaScript
  • 항해99
  • 코딩테스트준비
  • nodejs
  • 99클럽
  • 티스토리챌린지
  • 개발자취업
  • Client
  • 오블완
  • TiL

최근 댓글

hELLO · Designed By 정상우.
피곤핑

코딩일탈

0812 LSTM 텍스트 생성모델 구현 (온도 샘플링)
딥러닝

0812 LSTM 텍스트 생성모델 구현 (온도 샘플링)

2019. 8. 12. 12:55

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
    '딥러닝' 카테고리의 다른 글
    • 0812 소프트맥스 회귀로 MNIST 데이터 분석하기
    • 0812 텐서플로 기초
    • 0807 텍스트 데이터 다루기2 [모든 내용 적용하기]
    • 0807 17장 RNN [로이터 뉴스 카테고리 분류하기]
    피곤핑
    피곤핑

    티스토리툴바