딥러닝

[딥러닝] Simple RNN

퓨어맨 2022. 7. 26. 13:37

데이터셋 구축하기

  • 문자 하나하나를 단위로 RNN을 사용해보자!
  • hello, apple, lobby, daddy, bobby
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# 문제 데이터는 hell, appl, lobb, dadd, bobb
# 정답 데이터는 o, e, y, y, y

# timesteps는? 4번(순환 횟수)

 

# RNN 구조 파악을 위하여 직접 원핫인코딩을 해보자

# 문제 데이터
X_train = np.array(
    [
     # 각각의 단어들
     [ [1,0,0,0,0,0,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] ],   # 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,1,0,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,1,0,0,0,0,0],[0,0,0,0,0,0,1,0,0],[0,0,0,0,0,0,1,0,0] ]    # b,o,b,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))

 

 

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()

 

'딥러닝' 카테고리의 다른 글

[딥러닝] OpenCV  (0) 2022.07.28
[딥러닝] 로이터뉴스 카테고리분류(RNN+LSTM)  (0) 2022.07.28
[딥러닝] 데이터 증강(ImageDataGenerator)  (0) 2022.07.26
[딥러닝] VGG16 모델  (0) 2022.07.26
[딥러닝] CNN 모델  (0) 2022.07.26