본문 바로가기

딥러닝/인공신경망

LSTM 실습: imdb 예제

import tensorflow as tf
from tensorflow import keras
from keras.datasets import imdb
(X_train,y_train),(X_test,y_test) = imdb.load_data(num_words=10000)

keras의 기본 제공 데이터셋에서 imdb 데이터를 불러온다. 이는 imdb 사이트의 영화 리뷰 데이터이다.

 

 

print(X_train.shape)
print(y_train.shape)
print(X_test.shape)
print(y_test.shape)

(25000,)

(25000,)

(25000,)

(25000,)

train set과 test set 모두 25000개의 데이터를 가지고 있다.

 

 

X_train은 25000개의 list를 array로 가지고 있고, 각 list 안에는 숫자들이 들어있다.

 

 

data = imdb.get_word_index()
data

이 숫자들이 어떤 의미를 지니는지 알기 위해 아까 불러온 imdb에서 get_word_index 함수를 적용했다. 원래 영화 리뷰에 왼쪽의 단어를 오른쪽의 숫자로 인덱스를 적용한 것이다. 참고로, get_word_index의 인덱스에 +3을 해야 X_train의 인덱스와 같아지는 규칙이 있다.  

 

data2={}
for key,value in data.items():
    data2[value+3] = key
for idx,word in enumerate(('<pad>','<sos>','<unk>')):
    data2[idx] = word

data의 value에 3을 더한 딕셔너리를 data2로 다시 만들어 주었다. data2는 imdb의 인덱스와 같은 규칙을 가지고 4부터 시작한다. imdb의 인덱스 1, 2, 3은 각각 문장의 길이를 맞추는 '<pad>', 문장으 시작을 알리는 '<sos>', 모르는 단어인 '<unk>'를 가지고, 이를 추가해주었다.

 

 

for j in range(5):
    print(' '.join([data2[i] for i in X_train[j] ]))
    print()

 X_train의 첫 5개의 리뷰를 복원하겠다. X_train의 인덱스가 data2의 key와 동일할 때의 value값이 그에 해당하는 단어이고, 이를 ' '로 이어주었다.

예를 들어, j = 0일 때, X_train[0]의 인덱스 [1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, ...] 의 하나하나가 i가 돼서 data2의 key로 들어가고, 그 때의 value가 단어로 찾아진다.

 

 

from keras.preprocessing import sequence
X_train = sequence.pad_sequences(X_train,maxlen=50)
X_test = sequence.pad_sequences(X_test,maxlen=50)

그런데, X_train과 X_test의 각 리뷰가 너무 길다는 단점이 있어서 이를 keras.preprocessing.sequence로 리뷰 하나 당 최대 길이를 maxlen = 50으로 맞춰 주었다. 

 

X_train[0]

첫번째 리뷰의 길이가 50으로 줄은 것을 확인할 수 있다.

 

print(' '.join([data2[i] for i in X_train[0]]))

maxlen을 적용한 첫번째 리뷰의 인덱스를 실제 단어로 바꾼 예시이다. 

 

 

from keras.layers.embeddings import Embedding
from keras.models import Sequential
from keras.layers import LSTM, Dense

model = Sequential()
model.add(Embedding(input_dim=10000,output_dim=32,input_length=50 ))
model.add(LSTM(units=100))   # model.add(GRU(128))
model.add(Dense(units=1,activation='sigmoid'))

전처리 한 dataset으로 keras의 LSTM 모델을 생성하겠다.

keras.models.Sequential로 model을 sequential 하게 쌓는다고 선언하는 것으로 시작한다.

모델에 넣을 input은 숫자들의 리스트 형태인데, 이를 Embedding 층을 거쳐서 embedding vector를 만들어 준다. X_train의 단어의 수가 10000개이므로 input_dim = 10000으로 설정했다. embedding 후 벡터가 32차원이 되도록 하고, X_train, X_test에서 maxlen = 50으로 설정했으므로 input_length = 50으로 해준다.

노드의 수를 100개로 LSTM 모델을 쌓는다. 

마지막으로, Dense 층은 리뷰가 긍정인지(1) 부정인지(0) 예측하는 모델이므로 units = 1, activation = 'sigmoid'로 설정한다.  

 

 

model.compile(loss = 'binary_crossentropy',optimizer='adam',metrics=['accuracy'])
model.fit(X_train,y_train,epochs=10,batch_size=64,verbose=2)
loss,acc = model.evaluate(X_test,y_test)
print('loss:',round(loss,3))
print('acc:',round(acc,3))

loss: 1.117 acc: 0.775의 손실값과 정확도를 얻었다.

 

'딥러닝 > 인공신경망' 카테고리의 다른 글