Recent Posts
Recent Comments
Link
Today
Total
11-03 22:30
관리 메뉴

Hippo's data

RNN(Recurrent Neural Network) 순환 신경망 구현 본문

DL(Deep Learning)

RNN(Recurrent Neural Network) 순환 신경망 구현

Hippo's data 2024. 1. 10. 17:02
728x90

오늘은 DNN, CNN에 이어 딥러닝 모델 중 하나인 RNN(Recurrent Neural Network) 순환 신경망을 구현해보도록 하겠습니다

 

RNN은 입출력을 시퀀스(sequence) 단위로 처리하는 모델인데요 즉, 순서가 있는 문제에 주로 사용되는데요

시계열 처리, 자연어 처리 / 이미지 주석생성, 언어모델링, 음성인식 등에 주로 활용됩니다

 

DNN에 비해 hidden layer를 위와 옆(두방향)으로 이어진다는 것이 큰 특징입니다 

https://en.wikipedia.org/wiki/File:Recurrent_neural_network_unfold.svg

 

<RNN 구조들>

https://hwi-doc.tistory.com/entry/cs231n-Recurrent-Neural-Network-RNN

one to many -> 사진 설명 붙이기

many to one -> 감성분류(Positive / negative)

many to many ->  번역

 

## RNN 문제점 -> 기울기 소실(Gradient Vanishing)

-> 역전파Gradient가 점점 줄어들어 학습능력 크게 저하됨

-> LSTM (Long Short-Term Memory, 장단기 메모리) 등장

 

< RNN, LSTM 차이점 >

https://ratsgo.github.io/natural%20language%20processing/2017/03/09/rnnlstm/

 

-> LSTM은 기존 RNN의 hidden layer + cell state를 통해 기억해야할 정보를 전달함

-> 시계열데이터, 자연어 처리시 더 자주 사용됨

 

< RNN 모델링>

1) 불러오기 

2) 모델 생성 

3) 모델 학습

 

1) 불러오기 

import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
from tensorflow.keras.layers import LSTM

 

 

X_train = X_train.reshape(-1, 5, 1)    # 3차원 형식으로 변경필요 
X_test = X_test.reshape(-1, 5, 1)

 

2) 모델 생성 

 

model = Sequential()    # 틀을 만듦 
model.add(LSTM(4, activation='relu', return_sequences=True, input_shape=(5, 1)))

# return_sequences=False ->many to one / True ->many to many

model.add(LSTM(3, activation='relu', return_sequences=True))
model.add(Flatten())    # 1차원으로 쭉 핌
model.add(Dense(1, activation='sigmoid'))   # 이진분류 

 

# 모델 컴파일

model.compile(optimizer='adam', 
              loss='binary_crossentropy',    # 이진분류 
              metrics=['accuracy']) 

 

3) 모델 학습

history = model.fit(x=X_train, y=y_train, 
          epochs=10 , batch_size=128,
          validation_data=(X_test, y_test), 
          verbose=1
)

 

losses = pd.DataFrame(model.history.history)     # 데이터 프레임 형식으로 지표 결과 보여주기 

 

# 모델 구조 확인

model.summary() 

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
lstm (LSTM)                  (None, 5, 4)            4352      
_________________________________________________________________
lstm_1 (LSTM)                (None, 5, 3)            3136      
_________________________________________________________________
flatten_1 (Flatten)          (None, 15)               0         
_________________________________________________________________
dense_1 (Dense)             (None, 1)                 9         
=================================================================
Total params: 9,809
Trainable params: 9,809
Non-trainable params: 0

728x90