반응형



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

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 활용구조






반응형
'빅데이터 서비스 교육 > 딥러닝' 카테고리의 다른 글
딥러닝 OpenCV실습 (0) | 2022.07.28 |
---|---|
로이터 뉴스 카테고리 분류 실습(RNN, LSTM) (0) | 2022.07.27 |
전이학습 & 데이터 확장 (0) | 2022.07.25 |
딥러닝 다중분류 모델 (3가지 동물 분류) - MLP, CNN, 데이터 확장 예제 (0) | 2022.07.22 |
CNN (0) | 2022.07.21 |