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

블로그 메뉴

  • 홈
  • 방명록

공지사항

인기 글

태그

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

최근 댓글

hELLO · Designed By 정상우.
피곤핑

코딩일탈

0807 6장 텍스트 데이터 다루기 [Embedding층에 사용할 IMDB 데이터 로드하기]
딥러닝

0807 6장 텍스트 데이터 다루기 [Embedding층에 사용할 IMDB 데이터 로드하기]

2019. 8. 7. 14:50

원-핫 인코딩 

- 단어수준의 원-핫인코딩

import numpy as np

# 초기 데이터 : 각 원소가 샘플
# ( 이 예에서 하나의 샘플이 하나의 문장. 하지만 문장 전체가 될 수 도 있음 )
samples = ['The cat sat on the mat.', 'The dog ate my homework.']

# 데이터에 있는 모든 토큰의 인덱스를 구축
token_index = {}
for sample in samples :
    # split() 메서드를 사용해 샘플을 토큰으로 나눈다.
    # 실전에서는 구둣점과 특수 문자도 사용
    for word in sample.split():
        if word not in token_index:
            # 단어마다 고유한 인덱스 할당
            token_index[word] = len(token_index) +1
            # 인덱스 0은 사용하지 않음.

# 각 샘플에서 max_length까지 단어만 사용
max_length = 10 # 샘플을 벡터로 변환

# 결과를 저장할 배열
results = np.zeros((len(samples), max_length, max(token_index.values())+1))
for i, sample in enumerate(samples) :
    for j, word in list (enumerate(sample.split()))[:max_length]:
        index = token_index.get(word)
        results[i,j,index] = 1.

 

 - 문자 수준 원-핫 인코딩

import string

samples = ['The cat sat on the mat.', 'The dog ate my homework.']
characters = string.printable # 출력 가능한 모든 아스키 문자
token_index = dict(zip(characters, range(1, len(characters)+1)))

max_length = 50
results = np.zeros((len(samples), max_length, max(token_index.values()) +1))
for i, sample in enumerate(samples) :
    for j, character in enumerate(sample[:max_length]):
        index = token_index.get(character)
        results[i,j,index] = 1.

 

 - 케라스 원-핫인코딩

# 단어 인덱스 구축

샘플단어를 쭉 늘어놓고 인덱스를 넣어줌

# word_index : 인덱스와 단어가 들어있는 딕셔너리

from keras.preprocessing.text import Tokenizer
samples = ['The cat sat on the mat.', 'The dog ate my homework.']

# 가장 빈도가 높은 1000개의 단어만 선택하도록 Tokenizer 객체를 만듦
tokenizer = Tokenizer(num_words = 1000)

# 단어 인덱스를 구축
tokenizer.fit_on_texts(samples)

# 문자열을 정수 인덱스의 리스트로 변환함
sequences = tokenizer.texts_to_sequences(samples)

# 직접 원-핫 이진벡터 표현을 얻을 수 있음
# 원-핫 코딩 외에 다른 벡터화 방법들도 제공
one_hot_results = tokenizer.texts_to_matrix(samples, mode='binary')

# 계산된 단어 인덱스를 구함.
word_index = tokenizer.word_index
print('Found %s unique tokens.' % len(word_index))

 

 - 해싱기법 사용

- 어휘 사전에 있는 고유한 토큰의 수가 너무 커서 모두 다루기 어려울 때 사용.

- 각 단어에 명시적으로 인덱스를 할당하고 이 인덱스를 딕셔너리에 저장하는 대신 단어를 해싱하여 고정된 크기의 벡터로 변환.

- 명시적 단어 인덱스가 필요치 않아서 메모리를 절약하고 온라인 방식으로 데이터를 인코딩할 수 있음

- 해시충돌이 발생할 경우 머신러닝 모델은 단어사이의 차이를 인식하지 못함

  -> 해싱 공간의 차원이 해싱될 고유 토큰의 전체 개수보다 훨씬 크면 해시 충돌의 가능성 감소

 

## 해싱기법 사용
samples = ['Theh cat sat on the mat.', 'The dog ate my homework.']

dimensionality = 1000
max_length = 10

results = np.zeros((len(samples), max_length, dimensionality))
for i, sample in enumerate(samples) : 
    for j, word in list(enumerate(sample.split()))[:max_length] :
        # 단어를 해싱하여 0과 1000사이의 랜덤한 정수 인덱스로 변환
        index = abs(hash(word))% dimensionality
        results[i, j, index] = 1.

 


단어임베딩

-> 더 많은 정보를 적은 차원에 저장

 - 임베딩 층을 사용하기

 - 단어 인덱스가 임베딩 층으로 입력이됨!

 - 임베딩 차원 (64차원)

 


 - 영화리뷰중 긍정적, 부정적 리뷰 구별하기

10000명의 사람이 쓴 데이터를 한 문장처럼 읽어들이는데 한사람이 데이터중에 500단어만 사용하겠다 알려주면

500개씩 10000개가 있는데 이걸로 분류를 해냄. 긍정적인지 부정적인지

 

from keras.datasets import imdb
from keras import preprocessing 

max_features = 10000
maxlen = 20

(x_train, y_train), (x_test, y_test) = imdb.load_data(
num_words = max_features)

x_train = preprocessing.sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = preprocessing.sequence.pad_sequences(x_test, maxlen=maxlen)

 - 모델 생성 및 실행

### 6-6

from keras.models import Sequential
from keras.layers import Flatten, Dense, Embedding

model = Sequential()
model.add(Embedding(10000, 8, input_length=maxlen))

model.add(Flatten())

model.add(Dense(1, activation='sigmoid'))

model.compile(optimizer = 'rmsprop', loss = 'binary_crossentropy', metrics=['acc'])
model.summary()

 * model.summary() 실행화면

 - 학습

 약 75% 정확도를 얻음

history = model.fit(x_train, y_train,
                   epochs = 10,
                   batch_size = 32,
                   validation_split = 0.2)

 - 그래프로 표현

'딥러닝' 카테고리의 다른 글

0807 텍스트 데이터 다루기2 [모든 내용 적용하기]  (0) 2019.08.07
0807 17장 RNN [로이터 뉴스 카테고리 분류하기]  (0) 2019.08.07
0807 미세조정 fine-tuning  (0) 2019.08.07
0807 사전훈련된컨브넷사용하기 - VGG16합성곱  (1) 2019.08.07
0806 kaggle 자료 이용해서 컨브넷 훈련하기 - 소규모데이터  (0) 2019.08.06
    '딥러닝' 카테고리의 다른 글
    • 0807 텍스트 데이터 다루기2 [모든 내용 적용하기]
    • 0807 17장 RNN [로이터 뉴스 카테고리 분류하기]
    • 0807 미세조정 fine-tuning
    • 0807 사전훈련된컨브넷사용하기 - VGG16합성곱
    피곤핑
    피곤핑

    티스토리툴바