[모두의 딥러닝] 24. 순환 신경망(RNN), LSTM(Long Short Term Memory) - 로이터 뉴스 카테고리 분류 데이터

순환 신경망(Recurrent Neural Network, RNN)

- 여러 개의 데이터가 순서대로 입력되었을 때 앞서 입력받은 데이터를 잠시 기억해 놓는 방법

- 기억된 데이터가 얼마나 중요한지 판단하고 별도의 가중치를 주어 다음 데이터로 넘김

 

 

1. 다수 입력 단일 출력

ex) 문장을 읽고 뜻을 파악할 때

 

 

2. 단일 입력 다수 출력

ex) 사진의 캡션을 만들 때

 

 

3. 다수 입력 다수 출력

ex) 문장을 번역할 때

 

 

 

LSTM(Long Short Term Memory)

 

- 반복되기 전에 다음 층으로 기억된 값을 넘길지 여부를 관리하는 단계를 하나 더 추가
- RNN의 기울기 소실 문제를 보완




LSTM 예제 - 로이터 뉴스 카테고리 분류 데이터

- 11,228개의 뉴스 기사를 읽고 이 데이터가 어떤 의미를 지니는지 46개의 카테고리로 분류


1. 환경 및 데이터 준비

  • load_data(num_words=n, test_split=n)

: 데이터셋 로드
- num_words : 가장 빈도가 높은 상위 단어의 개수

- test_split : 테스트셋으로 지정할 데이터 비율

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Embedding
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.datasets import reuters       # 로이터 뉴스 데이터셋 불러오기
from tensorflow.keras.callbacks import EarlyStopping

import numpy as np
import matplotlib.pyplot as plt

# 데이터를 불러와 학습셋, 테스트셋으로 나눔
(X_train, y_train), (X_test, y_test) = reuters.load_data(num_words=1000, test_split=0.2)

 

 

2. 데이터 확인

- 로이터 뉴스 데이터는 토큰화와 정수 인코딩 완료된 상태

category = len(set(y_train))
print('카테고리 :', category)
print('학습용 뉴스 기사 :', len(X_train))
print('테스트용 뉴스 기사 :', len(X_test))
print(X_train[0])
카테고리 : 46
학습용 뉴스 기사 : 8982
테스트용 뉴스 기사 : 2246
[1, 2, 2, 8, 43, 10, 447, 5, 25, 207, 270, 5, 2, 111, 16, 369, 186, 90, 67, 7, 89, 5,
19, 102, 6, 19, 124, 15, 90, 67, 84, 22, 482, 26, 7, 48, 4, 49, 8, 864, 39, 209, 154,
6, 151, 6, 83, 11, 15, 22, 155, 11, 15, 7, 48, 9, 2, 2, 504, 6, 258, 6, 272, 11, 15,
22, 134, 44, 11, 15, 16, 8, 197, 2, 90, 67, 52, 29, 209, 30, 32, 132, 6, 109, 15, 17, 12]

 

 

3. 데이터 전처리 - 패딩(padding), 원-핫 인코딩

  • 패딩

- maxlen : 단어 수 맞춤

# 단어의 수 맞추어 줌
X_train = sequence.pad_sequences(X_train, maxlen=100)
X_test = sequence.pad_sequences(X_test, maxlen=100)

 

  • 원-핫 인코딩
# 원-핫 인코딩 처리
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)

 

 

4. 모델 설정

  • LSTM()

: LSTM 층 생성
: keras에 존재
- activation: LSTM의 활성화 함수로는 주로 tanh 함수 사용

model = Sequential()
model.add(Embedding(1000, 100))
model.add(LSTM(100, activation='tanh'))
model.add(Dense(46, activation='softmax'))

 

 

5. 모델 실행 환경 설정 및 최적화

# 모델의 실행 옵션 결정
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])

# 학습의 조기 중단 설정
early_stopping_callback = EarlyStopping(monitor='val_loss', patience=5)

 

 

6. 모델 실행

history = model.fit(X_train, y_train, batch_size=20, epochs=200, validation_data=(X_test, y_test), callbacks=[early_stopping_callback])

# 테스트 정확도 출력
print("\n Test Accuracy: %.4f" % (model.evaluate(X_test, y_test)[1]))

 

 

6. 데이터 시각화

# 학습셋과 테스트셋의 오차 저장
y_vloss = history.history['val_loss']
y_loss = history.history['loss']

# 그래프로 표현
x_len = np.arange(len(y_loss))
plt.plot(x_len, y_vloss, marker='.', c="red", label='Testset_loss')
plt.plot(x_len, y_loss, marker='.', c="blue", label='Trainset_loss')

# 그래프에 그리드를 주고 레이블 표시
plt.legend(loc='upper right')
plt.grid()
plt.xlabel('epoch')
plt.ylabel('loss')
plt.show()

 

 

 

'모두의 딥러닝 개정 3판'의 내용과 https://github.com/taehojo/deeplearning의 코드 참고