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

시계열 분석_4.GRU 본문

딥러닝_개념

시계열 분석_4.GRU

Elleik 2023. 1. 18. 23:15
728x90

GRU(Gated Recurrent Unit)

  • LSTM의 장점을 유지하면서 게이트 구조를 단순하게 만든 순환 신경망
  • LSTM에서 사용하는 망각 게이트와 입력 게이트를 하나로 합친 것, 별도의 업데이트 게이트로 구성됨

GRU 구조

1. 망각 게이트(Reset gate)

  • 과거 정보를 적당히 초기화시키려는 목적으로 시그모이드 함수를 출력으로 이용하여 (0,1) 값을 이전 은닉층에 곱함

 

2. 업데이트 게이트(Update gate)

  • 과거와 현재 정보의 최신화 비율을 결정하는 역할
  • 시그모이드로 출력한 결과는 현시점의 정보량으로 결정하고 1에서 뺀 값은 직전 시점의 은닉층 정보와 곱함

3. 후보군(Candidate)

  • 현시점의 정보에 대한 후보군을 계산
  • 과거 은닉층의 정보를 그대로 이용하지 않고 망각 게이트의 결과를 이용하여 후보군을 계산

GRU 실습

2023.01.16 - [딥러닝_개념] - 시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현

 

시계열 분석_2.순환 신경망(RNN)_2)RNN 셀 구현

### 라이브러리 호출 import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = "2" import tensorflow as tf import numpy as np from tensorflow import keras from tensorflow.keras import layers from tensorflow.keras.models import Sequential from tensorflow.keras.l

elleik.tistory.com

이전 게시물의 기반으로 실습 진행하기 때문에 이전글 확인 후 아래의 실습을 보시는 걸 추천드립니다.
이전 게시물과 동일하게 라이브러리 호출, 값 초기화, 데이터셋 준비를 실행합니다. 

 

### 네트워크 생성

class GRU_Build(tf.keras.Model):

  def __init__(self, units):
    super(GRU_Build, self).__init__()

    self.state0 = [tf.zeros([batch_size, units])]
    self.state1 = [tf.zeros([batch_size, units])]

    self.embedding = tf.keras.layers.Embedding(total_words, embedding_len, input_length=max_review_len)
    self.RNNCell0 = tf.keras.layers.GRUCell(units, dropout=0.5)
    self.RNNCell1 = tf.keras.layers.GRUCell(units, dropout=0.5)
    self.outlayer = tf.keras.layers.Dense(1)

  def call(self, inputs, training=None):
    x = inputs
    x = self.embedding(x)
    state0 = self.state0
    state1 = self.state1
    for word in tf.unstack(x, axis=1):
      out0, state0 = self.RNNCell0(word, state0, training)
      out1, state1 = self.RNNCell1(out0, state1, training)

    x = self.outlayer(out1)
    prob = tf.sigmoid(x)

    return prob

### 모델 훈련

import time 
units = 64
epochs = 4
t0 = time.time()

model = GRU_Build(units)

model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss=tf.losses.BinaryCrossentropy(),
              metrics=['accuracy'],
              experimental_run_tf_function=False)

model.fit(train_data, epochs=epochs, validation_data=test_data, validation_freq=2)

 

모델 훈련 결과


### 모델 평가

print("훈련 데이터셋 평가 >>> ")
(loss, accuracy) = model.evaluate(train_data, verbose=0)
print("loss={:.4f}, accuracy={:.4f}%".format(loss,accuracy * 100))
print("테스트 데이터셋 평가 >>> ")
(loss, accuracy) = model.evaluate(test_data, verbose=0)
print("loss={:.4f}, accuracy={:.4f}%".format(loss,accuracy * 100))
t1 = time.time()
print('시간: ', t1-t0)

모델 평가 결과

상세 설명

  • LSTM의 테스트 데이터셋 평가 정확도인 83.4575%에서 미세하게 정확도가 낮지만 전반적인 정확도는 나쁘지 않음

 

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