빅데이터 서비스 교육/딥러닝

RNN모델

Manly 2022. 7. 26. 12:45
반응형

머신러닝 텍스트 마이닝과 같이 문장을 의미단위로 하나씩 끊어서 입력한다.

 

 

 

RNN 모델은

기존의 데이터를 기억해서

새로운 데이터와 같이 합쳐서

연산을 진행한다.

 (순환)

 

 

 

           t : 현재시간   f: 가중치   

 

relu는 음수 일때 0값이기 때문에

RNN에서 이전 데이터가 음수이면 0으로 값을 전달 할 수 없어서

RNN에서 relu를 쓰지 않고 tanh를 쓴다

 

 

 

 

units는 생략가능

 

 

 

 

 

 

                                                   이전(CNN등)                                                              RNN

 

hello를 SimpleRNN신경망으로 학습하기

 

목표

  • 간단한 데이터를 직접 만들어서 RNN의 구조를 익혀보자
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
 

데이터셋 구축하기

  • 문자 하나하나를 단위로 RNN을 사용해보자
  • hello, apple, lobby, daddy, bobby
# 문제데이터는 hell, appl, lobb, dadd, bobb
# 정답데이터는 o, e, y, y, y

# timesteps는? 4번
 

원핫인코딩으로 문자를 숫자로 변경

  • 문제 + 정답 전체 데이터에서 등장하는 문자는 h, e, l, o, a, p, b, y, d 총 9개
# RNN 구조 파악을 위하여 직접 원핫인코딩을 해보자
 
# 문제 데이터
X_train = np.array(
    [
      # 각각의 단어들
     [[1,0,0,0,0,0,0,0,0], [01,1,0,0,0,0,0,0,0],[0,0,1,0,0,0,0,0,0], [0,0,1,0,0,0,0,0,0]],  # h, e, l, l
     [[0,0,0,0,1,0,0,0,0], [0,0,0,0,0,1,0,0,0],[0,0,0,0,0,1,0,0,0], [0,0,0,1,0,0,0,0,0]],  # a, p, p, l
     [[0,0,1,0,0,0,0,0,0], [0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,1,0,0], [0,0,0,0,0,0,1,0,0]],  # l, o, b, b
     [[0,0,0,0,0,0,0,0,1], [0,0,0,0,1,0,0,0,0],[0,0,0,0,0,0,0,0,1], [0,0,0,0,0,0,0,0,1]],  # d, a, d, d
     [[0,0,0,0,0,0,1,0,0], [0,0,0,0,1,0,0,0,0],[0,0,0,0,1,0,0,0,0], [0,0,0,0,0,0,1,0,0]]   # b, o, o, b
    ]
)

# 정답 데이터
y_train = np.array(
    [
     [0,0,0,1,0,0,0,0,0],  # o
     [0,1,0,0,0,0,0,0,0],  # e
     [0,0,0,0,0,0,0,1,0],  # y
     [0,0,0,0,0,0,0,1,0],  # y
     [0,0,0,0,0,0,0,1,0],  # y  
    ]
)
X_train.shape, y_train.shape
# X_train : (samples(데이터의수), timesteps(순환횟수), features(데이터의 특성수 = 원핫인코딩 된 레이블 수))
((5, 4, 9), (5, 9))
 

출력되는 값을 알파벳 전체로 하고 싶다면 26개로 원핫인코딩

  • 현재는 RNN을 알아보기 위해 간단히 9개의 문자로만 문제와 정답을 설정함

RNN 신경망 모델링

from tensorflow.keras import Sequential
from tensorflow.keras.layers import Dense, SimpleRNN
 
model = Sequential()

# RNN 입력층 + 중간층
# 8개의 뉴런을 가지고 각 뉴런이 4번씩 순호나하며 각 순환마다 9개의 숫자가 들어감
model.add(SimpleRNN(8, input_shape=(4,9)))

# 출력층
# 사용되는 문자가 총 9개이고 그 중에서 정답(다음에 나올 단어)을 찾아내는 것이므로 다중분류로 볼 수 있음
model.add(Dense(9, activation='softmax'))

model.summary()

# RNN은 가중치가 두 종류가 있다 (과거데이터의 가중치, 현재데이터의 가중치)
# 현재데이터의 가중치 -> 9(입력특성수)*8(RNN층 뉴런수) + 8(RNN층 뉴런수=b값)
# 과거데이터의 가중치 -> 8(RNN층 뉴런수) *8(RNN층 뉴런수)
# RNN층의 각 뉴런들이 뽑아낸 결과는 다시 같은층 모든 뉴런들에게 과거데이터로 들어가게 됨
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn (SimpleRNN)      (None, 8)                 144       
                                                                 
 dense (Dense)               (None, 9)                 81        
                                                                 
=================================================================
Total params: 225
Trainable params: 225
Non-trainable params: 0
_________________________________________________________________
model.compile(loss='categorical_crossentropy',
              optimizer='Adam',
              metrics=['acc'])
 
h = model.fit(X_train, y_train, epochs=200)
 
plt.figure(figsize=(15,5))

plt.plot(h.history['acc'], label='acc')

plt.legend()
plt.show()
 

 

RNN 활용구조

 

반응형