본문 바로가기
머신러닝딥러닝/딥러닝

딥러닝(Deep Learning) #15 - RNN

by orangecode 2022. 4. 15.
728x90
순환신경망(Recurrent Neural Network, RNN)

순환신경망은 여러개의 데이터가 순차적으로 입력되었을 때,

앞서 입력받은 데이터를 잠시 기억해 놓는 방법을 사용한다.

 

기억된 데이터가 얼마나 중요한지 판단하여 가중치를 준 뒤, 다음 데이터로 넘어간다.

 

모든 입력 값에 기억, 판단, 가중치 부여 작업을 실행함으로 같은 층 안에서 계속 맴도는 성질 때문에 순환신경망이라고 부른다.

 

RNN의 문제점

1. 

 

 

 

 

RNNLSTM(Long Short Term Memory)방법과 함께 가장 많이 사용되고 있다.

LSTM(Long Short Term Memory)

RNN의 한 종류로, 긴 의존기간을 필요로 하는 학습을 수행할 능력을 갖추고 있음.

 

 

 

LSTM 구동순서

1. CELL STATE

Linear interaction 만 적용시키며, 전체체인을 구동시키고 정보가 전혀 바뀌지않고 그대로 흐른다는 특징이 있다.

 

2. GATE1 = sigmoid layer 층(forget gate layer)

sigmoid layer(forget gate layer)

앞으로 들어오는 새로운 정보 중 cell state에 저장할 것을 정하는 gate이다.

 

 

GATE2 : input gate layer

sigmoid layer = 과거  state Ct-1을 업데이트 → 새로운 Cell state Ct를 만듬.

tanh layer = 새로운 후보값 Ct(Vector)를 생성, Cell state 추가 준비

sigmoid, tanh 정보를 합쳐 state에 업데이터 재료를 만든다.

 

 

cell state 업데이트

 

input layer Gate 에서 온 it * Ct를 더한다.

더하는 값 it * Ct는 두번째 단계에서 업데이트하기로 한 값을 업데이트 할지 정한만큼 scale한 값이 된다.

 

이전 단계에서 정했던 사항들을 실천하는 단계라고 볼 수 있다.

 

 

GATE 3 : Output Gate Layer

1. sigmoid layer에 input data를 입력 → output으로 보낼 부분 선택

 

2. cell layer를 tanh layer에 태워 -1 ~ +1 사이의 값으로 만든다.

 

3. -1 ~ +1 값을 sigmoid Gate의 output과 곱한다.

 

4. output으로 보내고자 하는 부분만 전송이 가능하다.

 

LSTM 예제 코드

LSTM 라이브러리 설정

# LSTM = Long Short Term Memory
# RNN
# 로이터 뉴스 카테고리 분석하기

from tensorflow.keras.datasets import reuters
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, LSTM, Embedding
from tensorflow.keras.preprocessing import sequence
from tensorflow.python.keras.utils import np_utils

import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

# seed 값 고정하기
seed = 0
np.random.seed(seed)
tf.set_random_seed(seed)

LSTM 설정에 필요한 라이브러리 LSTM, Embedding, np_utils를 가져온다.

내장 데이터 이용을 위해 reuters를 가져온다.

 

 

데이터 가져오기

#데이터 train, test set으로 나누기
# num_words = 1000 -> 1~1000개의 단어만 가져올 것
# test_split : train 80%, test 20%
(x_train, y_train), (x_test,y_test) = reuters.load_data(num_words=1000, test_split=0.2)

reuters.load_data(num_word=1000, test_split=0.2)

로이티뉴스 데이터 reuters를 가져오면서 단어가 1000개 이상 넘지 않도록 제한해서 가져온다.

가져온 데이터를 train 80%, test 20%로 분류한다.

 

데이터 전처리

# 데이터 전처리
# pad_sequence(maxlen) = 단어 수를 100개로 맞춰라 
# 단어 > 100 이라면 나머지 버림
# 단어 < 100 이라면 나머지 0으로 채움
x_train = sequence.pad_sequences(x_train, maxlen=100)
x_test = sequence.pad_sequences(x_test, maxlen=100)

# One-Hot Encoding
y_trian = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

pad_sequence() 함수 :

초기 입력과 동일한 크기를 유지되도록 하는 패딩(Padding), 최대 크기를 100으로 맞춰서 패딩한다.

단어 > 100 이라면 나머지 버림
단어 < 100 이라면 나머지 0으로 채움

 

One_Hot Encoding

y_trian = np_utils.to_categorical(y_train)
y_test = np_utils.to_categorical(y_test)

 

to_categorical()함수를 이용하여 y_train, y_test 데이터를 [0, 0, 0, 0, 1, 0, ..., 0]로 만든다

 

# 딥러닝 모델 설정
# Embedding =?
model = Sequential()
model.add(Embedding(1000, 100))
model.add(LSTM(100, activation='tanh'))
model.add(Dense(46, activation='softmax'))
# model.add(Dense(1, activation='sigmoid'))

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

# 모델 실행
history = model.fit(x_train, y_train, epochs=20, batch_size=50, validation_data=(x_test, y_test))
print("\n Test Accuracy: %.4f" % (model.evaluate(x_test, y_test)[1]))

Embedding()

데이터 전처리 과정을 통해 입력된 값을 받아 다음 층이 알아들을 수 있는 형태로 변환하는 역할

모델 설정의 가장 처음 부분에 위치해있어야 한다.

  - Embedding('불러온 단어의 총 개수',  '기사당 단어 수') 

 

LSTM()

RNN에서 기억 값에 대한 가중치를 제어하는 역할

  - LSTM(기사당 단어 수, 기타 옵션)

  - LSTM 활성화 함수 : Tanh를 사용

 

모델 실행

 

 

trainset, testset 오차 그래프로 표현하기

# 테스트 셋의 오차
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()

테스트 셋의 오차 = 빨간색

훈련 셋의 오차 = 파란색

 

반응형

댓글