DL 딥러닝 simple RNN(54)

이동일·2023년 11월 6일
0

DL

목록 보기
9/10

simple RNN(Recurrent Neural Network)

  • 시퀀스 데이터를 처리하기 위해 개발된 가장 기본적인 형태의 순환 신경망
  • 시퀀스 데이터를 처리하기 위해 개발된 가장 기본적인 형태의 순환 신경망
  • Simple RNN은 자연어 처리(Natural Language Processing, NLP), 시계열 예측(Time Series Forecasting), 음성 인식(Speech Recognition)과 같이 입력 데이터가 시간적 순서를 가지고 있는 문제를 해결하는 데 사용
  • RNN의 핵심 아이디어는 과거의 정보를 현재의 결정에 활용
  • 시퀀스가 길어질수록 시간적으로 멀리 떨어진 정보를 현재 의사 결정에 효과적으로 반영하는 데 어려움

  • 순환 신경망(RNN)의 발전된 형태인 LSTM(Long Short-Term Memory) 네트워크에서 사용되는 주요 구성 요소 중 하나
  • 메모리 셀은 정보를 장기간 저장하는 데 사용됩니다. 이는 RNN의 장기 의존성 문제를 해결
  • 각 메모리 셀에는 입력, 출력, 그리고 망각 게이트가 포함되어 있어, 셀이 저장하는 정보의 양을 조절
  • 모리 셀은 각 시간 단계마다 정보를 전달함으로써 네트워크가 이전의 입력을 "기억"하고 이를 기반으로 새로운 결정을 내릴 수 있게 해준다.
  • 계열 데이터나 자연어 처리와 같이 시간적으로 연결된 정보가 중요한 작업에 매우 유용
  • sequence-to-sequence 형태
  • 시퀀스를 다른 시퀀스로 변환하는 데 사용되는 신경망 아키텍처
  • 모델은 주로 머신 번역, 질문 응답 시스템, 텍스트 요약과 같이 입력과 출력이 시퀀스 형태인 문제에 적용

  • sequence-to-vector
  • 시퀀스 데이터를 고정된 크기의 벡터로 변환하는 신경망 모델
  • 이러한 아키텍처는 일반적으로 시퀀스 데이터의 전체 내용을 요약하여 단일 벡터 표현을 생성할 때 사용
  • 이 벡터는 시퀀스의 중요한 특징을 포착하고, 시퀀스 내의 다양한 요소 간의 관계를 반영

    1.텍스트 분류: 문장이나 문서 같은 텍스트 데이터를 입력으로 받아, 해당 텍스트의 의미를 요약하는 벡터로 변환한 후, 이 벡터를 사용하여 텍스트를 하나 또는 여러 범주로 분류
    2.감성 분석: 사용자 리뷰나 의견 등의 텍스트 시퀀스로부터 긍정적, 중립적, 또는 부정적 감성을 표현하는 벡터를 생성
    3.음성 인식: 오디오 신호 시퀀스를 벡터로 변환하여, 오디오의 의미나 중요 특징을 요약

  • 인코더-디코더(Encoder-Decoder) 아키텍처는 시퀀스 처리 작업에 널리 사용되는 신경망 구조
  • Encoder: 입력 시퀀스를 받아들여 고정된 길이의 컨텍스트 벡터(context vector)로 변환
  • Decoder:인코더로부터 받은 컨텍스트 벡터를 사용하여 출력 시퀀스를 생성 디코더는 각 시간 단계에서의 출력을 이전 시간 단계의 출력(또는 입력)과 결합하여 다음 출력을 생성
1.
import tensorflow as tf
import numpy as np



2.
# time stamp 데이터를 만들어보자
X = []
Y = []
for i in range(6):
    lst = list(range(i, i+4))

    X.append(list(map(lambda c: [c/10], lst)))
    Y.append((i+4)/ 10)

X = np.array(X)
Y = np.array(Y)
for i in range(len(X)):
    print(X[i], Y[i])
    
# 출력 형태
[[0. ]
 [0.1]
 [0.2]
 [0.3]] 0.4
[[0.1]
 [0.2]
 [0.3]
 [0.4]] 0.5
 
 
 
 
 
 
3.# simple RNN 구성
model = tf.keras.Sequential([
    tf.keras.layers.SimpleRNN(units=10, return_sequences= False, input_shape =[4, 1]),
    #input_shape 4,1뜻은   timesteps4,  input_dim 1
    #units: simpleRNN 레이어에 존재하는 뉴런의 수
    #return_sequences는 출력으로 시퀀스 전체를 출력할지 여부
    tf.keras.layers.Dense(1)
])

#출력
model.compile(optimizer='adam', loss='mse')
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn (SimpleRNN)      (None, 10)                120       
                                                                 
 dense (Dense)               (None, 1)                 11        
                                                            
 
4.# 학습
model.fit(X, Y, epochs= 100, verbose=0)



5.예측결과 확인
# 예측 결과 - 좋지 않다.
model.predict(np.array([[[0.6], [0.7], [0.8], [0.9]]]))
# 출력 array([[0.7918824]], dtype=float32)

model.predict(np.array([[[-0.1], [0.0], [0.1], [0.2]]]))
# 출력 array([[0.34469157]], dtype=float32)







6. 모델 복잡하게
# 모델을 복잡하게
model = tf.keras.Sequential([
    tf.keras.layers.SimpleRNN(units=10, return_sequences=True, input_shape = [4,1]),
    tf.keras.layers.SimpleRNN(units=10, return_sequences=True, input_shape = [4,1]),
    tf.keras.layers.SimpleRNN(units=10, return_sequences=True, input_shape = [4,1]),
    tf.keras.layers.SimpleRNN(units=10, return_sequences=False, input_shape = [4,1]),
    tf.keras.layers.Dense(1)

])
model.compile(optimizer='adam', loss = 'mse')
model.summary()
# 출력
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 simple_rnn_1 (SimpleRNN)    (None, 4, 10)             120       
                                                                 
 simple_rnn_2 (SimpleRNN)    (None, 4, 10)             210       
                                                                 
 simple_rnn_3 (SimpleRNN)    (None, 4, 10)             210       
                                                                 
 simple_rnn_4 (SimpleRNN)    (None, 10)                210       
                                                                 
 dense_1 (Dense)             (None, 1)                 11        
                                                         
                                                         
                                                        
7. 다시훈련
 model.fit(X, Y, epochs=100, verbose=1)
 
 
8. 결과 확인(이전보다 좋아졌다.)
# 결과 출력
model.predict(np.array([[[0.6],[0.7],[0.8],[0.9]]]))
#출력 array([[0.9083353]], dtype=float32)

 
 
                                                         # simple RNN의 단점
# 입력 데이터가 길어지면 학습 능력이 덜어진다. -Long-Term Dependency
# 현재의 답을 얻기 위해 과거의 정보에 의존해야 하는 RNN이지만  과거 시점이 현재와 너무 멀어지면 문제를 풀기 어렵다.    

0개의 댓글

관련 채용 정보