simple RNN(Recurrent Neural Network)
1.텍스트 분류: 문장이나 문서 같은 텍스트 데이터를 입력으로 받아, 해당 텍스트의 의미를 요약하는 벡터로 변환한 후, 이 벡터를 사용하여 텍스트를 하나 또는 여러 범주로 분류
2.감성 분석: 사용자 리뷰나 의견 등의 텍스트 시퀀스로부터 긍정적, 중립적, 또는 부정적 감성을 표현하는 벡터를 생성
3.음성 인식: 오디오 신호 시퀀스를 벡터로 변환하여, 오디오의 의미나 중요 특징을 요약
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이지만 과거 시점이 현재와 너무 멀어지면 문제를 풀기 어렵다.