빅데이터 | 머신러닝 | 딥러닝/딥러닝

[딥러닝 기초] recurrent neural network (using LSTM, keras)

냠냠:) 2020. 6. 15. 02:09

[이 글은 "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의 길이를 만든다.

 

 

LSTM_코랩
In [0]:
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)
In [2]:
(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)
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
17465344/17464789 [==============================] - 0s 0us/step
In [3]:
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: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
embedding (Embedding)        (None, None, 32)          32000     
_________________________________________________________________
lstm (LSTM)                  (None, 8)                 1312      
_________________________________________________________________
dense (Dense)                (None, 1)                 9         
=================================================================
Total params: 33,321
Trainable params: 33,321
Non-trainable params: 0
_________________________________________________________________
In [4]:
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))
Epoch 1/10
625/625 [==============================] - 17s 28ms/step - loss: 0.4679 - accuracy: 0.7854 - val_loss: 0.3845 - val_accuracy: 0.8366
Epoch 2/10
625/625 [==============================] - 17s 28ms/step - loss: 0.3454 - accuracy: 0.8561 - val_loss: 0.3572 - val_accuracy: 0.8474
Epoch 3/10
625/625 [==============================] - 17s 28ms/step - loss: 0.3162 - accuracy: 0.8693 - val_loss: 0.3555 - val_accuracy: 0.8456
Epoch 4/10
625/625 [==============================] - 17s 28ms/step - loss: 0.3005 - accuracy: 0.8736 - val_loss: 0.3579 - val_accuracy: 0.8436
Epoch 5/10
625/625 [==============================] - 17s 28ms/step - loss: 0.2850 - accuracy: 0.8824 - val_loss: 0.3589 - val_accuracy: 0.8400
Epoch 6/10
625/625 [==============================] - 17s 28ms/step - loss: 0.2713 - accuracy: 0.8885 - val_loss: 0.3617 - val_accuracy: 0.8418
Epoch 7/10
625/625 [==============================] - 17s 28ms/step - loss: 0.2582 - accuracy: 0.8942 - val_loss: 0.3699 - val_accuracy: 0.8402
Epoch 8/10
625/625 [==============================] - 17s 27ms/step - loss: 0.2469 - accuracy: 0.8984 - val_loss: 0.3908 - val_accuracy: 0.8418
Epoch 9/10
625/625 [==============================] - 17s 27ms/step - loss: 0.2409 - accuracy: 0.8990 - val_loss: 0.3919 - val_accuracy: 0.8322
Epoch 10/10
625/625 [==============================] - 17s 28ms/step - loss: 0.2276 - accuracy: 0.9065 - val_loss: 0.4382 - val_accuracy: 0.8234
In [5]:
loss, accuracy = model_LSTM.evaluate(x_val_seq, y_val)
print(accuracy)
157/157 [==============================] - 1s 8ms/step - loss: 0.4382 - accuracy: 0.8234
0.8234000205993652
반응형