본문 바로가기

딥러닝/인공신경망

LSTM 실습: reuters 예제

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

keras에서 제공하는 로이터 뉴스 데이터는 뉴스 기사 텍스트로 46개의 뉴스 토픽을 분류하는 예제이다.

keras.datasets에서 reuters를 불러왔다. 

 

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

(8982,) (8982,) (2246,) (2246,)으로, 약 4:1의 train: test 비율을 가진다. 

 

 

print(X_train[0])

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

print(X_train[0])

[1, 2, 2, 8, 43, 10, 447, 5, 25, 207, 270, 5, 3095, 111, 16, 369, ...]

array([ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 8, 43, 10, 447, ... ])

X_train의 첫번째 예제는 여러 라벨들의 나열 형식으로 되어 있다. 뉴스 내용이 너무 길기 때문에 pad_sequences로 max_len=100으로 줄여주었다.

 

 

from tensorflow.keras.utils import to_categorical

y_train = to_categorical(y_train.astype(np.int),46)
y_test = to_categorical(y_test.astype(np.int),46)

keras에서 분류 모델을 생성할 때는 target이 one hot encoding 되어야 하므로 tensorflow.keras.utils.to_categorical 함수로 y_train과 y_test를 모두 46개의 범주로 one hot encoding 시켰다. 

 

 

data1 = reuters.get_word_index()
data1

get_word_index 함수로 데이터셋의 라벨에 해당하는 단어가 무엇인지 딕셔너리 형태로 확인할 수 있다. 

 

 

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

get_word_index의 value에 3을 더해준 값이 train, test set의 인덱스와 같아지는 keras dataset의 규칙이 있어서, value에 3을 더해준 새로운 딕셔너리 data2를 만들어 주었다. 또한, data2의 첫 3 단어를 규칙에 맞게 <pad>, <sos>, <unk>로 추가했다. 

 

 

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

1000번째 train set의 원래 단어들을 출력했다. train set이 현재 maxlen=100으로 축소된 형태라서 원본 문장과는 다르게 보인다.

 

 

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=100))
model.add(LSTM(units=100, return_sequences=True)) 
model.add(LSTM(units=50))
model.add(Dense(units=46,activation='softmax'))

model에 Sequential()을 부여하고, Embedding 층을 쌓아 정수 형태로 들어간 단어들이 embedding vector가 되도록 해주었다. LSTM 층을 2번을 쌓았는데, output이 sequence 형태이어야 후에 LSTM을 더 쌓을 수 있으므로 return_sequences = True로 설정한다. LSTM 층을 unit의 수를 적게 하여 쌓고, 마지막으로 46개의 class를 분류할 수 있도록 units = 46, activation = 'softmax'인 Dense 층을 쌓아 준다. 

 

 

model.compile(loss = 'categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])
model.summary()

 

 

model.fit(X_train,y_train,epochs=10,batch_size=64,verbose=2)
loss,acc = model.evaluate(X_test,y_test)
print('손실값:',round(loss,3))
print('정확도:',round(acc,3))

손실값: 1.432 정확도: 0.648

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

LSTM 실습: imdb 예제  (0) 2021.07.26
CNN 실습: fashion mnist 예제  (0) 2021.07.23
CNN 실습: mnist 예제  (0) 2021.07.22
tensorflow, keras 실습: mnist 예제  (2) 2021.07.22
tensorflow, keras 실습: Iris data  (0) 2021.07.22