Colab으로 하루에 하나씩 딥러닝

시계열 분석_5.양방향 RNN 본문

딥러닝_개념

시계열 분석_5.양방향 RNN

Elleik 2023. 1. 19. 22:39
728x90

양방향 RNN(Bidirectional RNN)

  • RNN이전 시점의 데이터들을 참고해서 정답을 예측하지만, 실제 문제에서는 과거 시점이 아닌 미래 시점의 데이터에 힌트가 있는 경우도 있음
  • 이후 시점의 데이터도 함께 활용하여 출력 값을 예측하고자 하는 것

양방향 RNN 구조

1. 메모리 셀 2개

  • 첫 번째 메모리 셀은 이전 시점의 은닉 상태를 전달받아 현재의 은닉 상태를 계산 
  • 두 번째 메모리 셀은 다음 시점의 은닉 상태를 전달바아 현재의 은닉 상태를 계산

양방향 RNN 실습

### IMDB 데이터셋 활용, 모델 생성 후 훈련

import numpy as np
from tensorflow.keras.preprocessing import sequence
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Embedding, LSTM, Bidirectional
from tensorflow.keras.optimizers import Adam
from tensorflow.keras.datasets import imdb

n_unique_words = 10000
maxlen = 200
batch_size = 128

(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=n_unique_words)
x_train = sequence.pad_sequences(x_train, maxlen=maxlen)
x_test = sequence.pad_sequences(x_test, maxlen=maxlen)
y_train = np.array(y_train)
y_test = np.array(y_test)

model = Sequential()
model.add(Embedding(n_unique_words, 128, input_length=maxlen))
model.add(Bidirectional(LSTM(64)))  # LSTM에 양방향 RNN을 적용
model.add(Dropout(0.5)) 
model.add(Dense(1, activation='sigmoid'))

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=4,
          validation_data=[x_test, y_test])

모델 훈련 결과


### LSTM 모델 구조 확인

model.summary()

LSTM 모델 구조 확인


### 모델 평가

loss, acc = model.evaluate(x_train, y_train, batch_size=384, verbose=1)
print('Training accuracy', model.metrics_names, acc)
print('Training accuracy', model.metrics_names, loss)
loss, acc = model.evaluate(x_test, y_test, batch_size=384, verbose=1)
print('Testing accuracy', model.metrics_names, acc)
print('Testing accuracy', model.metrics_names, loss)

모델 평가 출력 결과

상세 설명

  • 훈련 데이터셋은 97% 정확도, 테스트 데이터셋은 약 86% 정확도로 나쁘지 않은 결과를 가짐

 

참고: 서지영, 『딥러닝 텐서플로 교과서』, 길벗(2022)