[이 글은 "Do it 딥러닝 입문" 책을 보고 공부한 내용을 복습하고자 정리한 글입니다.]
Recurrent Neural Network(RNN)
필요한 클래스 임포트
- sequence : 이 예제에서는 imdb라는 영화 리뷰 데이터를 활용한다. 리뷰에 나온 단어들을 확인할 때 리뷰마다 글자 수는 다를 수밖에 없다. sequence는 단어들이 들어가 있는 데이터의 길이를 통일하게 만들어준다.
- Embedding : 원-핫 인코딩으로 전처리된 데이터를 쓰게 되면 입력 데이터 크기와 사용할 수 있는 단어의 수가 제한된다는 문제가 있다. 또 원-핫 인코딩은 단어 사이에 관련이 없다고 가정할 때 사용한다. 즉, 단어를 고정된 길이의 실수 벡터로 만드는 임베딩 방식을 통해 벡터 사이의 거리(값의 차이)로 단어들의 상관도를 표현할 수 있다.
-> 매개변수로는 사용할 글자 개수, 고정길이가 들어간다.
- LSTM : LSTM 셀을 사용하는 순환 신경망이다. 순환 신경망에서 역전파 알고리즘을 사용할 때, 그레이디언트가 타임 스텝을 거슬러 가며 전파될 때 가중치가 반복하여 곱해지므로 그레이디언트가 크게 증가하거나 감소하는 현상을 잡기 위해 TBPTT를 구현하여 쓴다. 하지만 TBPTT는 그레이디언트가 타임 스텝 끝까지 전파되지 않으므로 타임 스텝이 멀리 떨어진 단어 사이의 관례를 파악하기 어렵다.
-> LSTM은 좀 더 긴 타임 스텝의 데이터를 처리할 수 있다.
-> LSTM은 은닉 상태 H와 셀 상태 C라는 2개의 출력이 순환된다.
데이터 전처리
imdb.load_data(skip_top = , num_words=)
- skip_top : 가장 많이 등장한 단어들 중 건너뛸 단어의 개수를 지정한다. (is, a, the 등은 많이 사용되지만 분석에 유용하지 않기 때문에)
- num_words : 훈련에 사용할 단어의 개수를 지정
sequence.pad_sequences(train, maxlen=)
- train : 사용할 훈련 데이터
- maxlen : 만약 100이 들어간다면 100보다 작은 길이의 훈련 데이터는 앞에서 부터 0을 채워 100의 길이를 만들고, 100보다 큰 길이를 갖고 있는 훈련 데이터는 앞에서부터 데이터를 없애 100의 길이를 만든다.
from tensorflow.keras.layers import LSTM , Dense, Embedding, Dropout
from tensorflow.keras.models import Sequential
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.datasets import imdb
import matplotlib.pyplot as plt
import numpy as np
np.random.seed(42)
(x_train_all, y_train_all), (x_test, y_test) = imdb.load_data(skip_top=20, num_words=1000)
for i in range(len(x_train_all)):
x_train_all[i] = [w for w in x_train_all[i] if w > 2]
random_index = np.random.permutation(25000)
x_train = x_train_all[random_index[:20000]]
y_train = y_train_all[random_index[:20000]]
x_val = x_train_all[random_index[20000:]]
y_val = y_train_all[random_index[20000:]]
x_train_seq = sequence.pad_sequences(x_train, maxlen=100)
x_val_seq = sequence.pad_sequences(x_val, maxlen= 100)
model_LSTM = Sequential()
model_LSTM.add(Embedding(1000,32))
model_LSTM.add(LSTM(8))
model_LSTM.add(Dense(1,activation='sigmoid'))
model_LSTM.summary()
model_LSTM.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
history = model_LSTM.fit(x_train_seq, y_train, epochs=10, batch_size=32, validation_data=(x_val_seq, y_val))
loss, accuracy = model_LSTM.evaluate(x_val_seq, y_val)
print(accuracy)
'빅데이터 | 머신러닝 | 딥러닝 > 딥러닝' 카테고리의 다른 글
[딥러닝 기초] Convolution Neuron Network for keras (0) | 2020.06.15 |
---|---|
[딥러닝 기초] Convolution Neuron Network 의류분류기 만들어보기 (0) | 2020.06.01 |
[딥러닝 기초] 다층 신경망을 통해 의류분류기 만들어보기(2) (using keras) (1) | 2020.05.14 |
[딥러닝 기초] 다층 신경망을 통해 의류분류기 만들어보기 (4) | 2020.05.12 |
[딥러닝 기초] 다층 신경망 (MLPClassifier) (0) | 2020.05.08 |