원-핫 인코딩
- 단어수준의 원-핫인코딩
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합성곱 (0) | 2019.08.07 |
0806 kaggle 자료 이용해서 컨브넷 훈련하기 - 소규모데이터 (0) | 2019.08.06 |