TensorFlow

TensorFlow 기초 37 - RNN(Recurrent Neural Network)

코딩탕탕 2022. 12. 13. 17:01

 

RNN(Recurrent Neural Network)은 히든 노드가 방향을 가진 엣지로 연결되어 순환구조를 이루는(directed cycle) 인공신경망의 한 종류입니다.
음성, 문자 등 순차적으로 등장하는 데이터 처리에 적합한 모델로 알려져 있다.
Convolutional Neural Networks(CNN)과 더불어 최근 들어 각광받고 있는 알고리즘이다.
활용 : 텍스트 분류, 품사 태깅, 문서 요약, 문서 작성, 기계 번역, 이미지 캡션... 등 사용

RNN은 sequence data : 입력값에 대해 현재의 state가 다음의 state에 영향을 준다.

 

 

# RNN(Recurrent Neural Network)은 히든 노드가 방향을 가진 엣지로 연결되어 순환구조를 이루는(directed cycle) 인공신경망의 한 종류입니다.
# 음성, 문자 등 순차적으로 등장하는 데이터 처리에 적합한 모델로 알려져 있다.
# Convolutional Neural Networks(CNN)과 더불어 최근 들어 각광받고 있는 알고리즘이다.
# 활용 : 텍스트 분류, 품사 태깅, 문서 요약, 문서 작성, 기계 번역, 이미지 캡션... 등 사용
# RNN은 sequence data : 입력값에 대해 현재의 state가 다음의 state에 영향을 준다.

from keras.models import Sequential
from keras.layers import SimpleRNN, LSTM, GRU, Dense

model = Sequential()
# model.add(SimpleRNN(units=3, input_shape=(2, 10)))
# model.add(SimpleRNN(3, input_length=2, input_dim=10)) # 위와 동일
model.add(LSTM(units=3, input_shape=(2, 10))) # Long Short-Term Memory units
print(model.summary())

model = Sequential()
model.add(LSTM(units=3, batch_input_shape=(8, 2, 10))) # batch_size=8, input_length=2, input_dim=10
print(model.summary())

model = Sequential()
model.add(LSTM(units=3, batch_input_shape=(8, 2, 10), return_sequences=True)) # 다음 층으로 모든 은닉상태를 전달
print(model.summary())

# LSTM으로 다음 숫자 예측하기
from numpy import array

x = array([[1,2,3],[2,3,4],[3,4,5],[4,5,6],[5,6,7],[10,20,30],[20,30,40],[30,40,50]])
y = array([4,5,6,7,8,40,50,60])
print(x, x.shape) # (8, 3)
print(y, y.shape) # (8,)

print(x, x.shape) # (8, 3, 1)

# 모델 구성
model = Sequential()
model.add(LSTM(10, activation='tanh', input_shape=(3, 1)))
# model.add(LSTM(10, activation='tanh', input_shape=(3, 1), return_sequences=True)) # many-to-many
model.add(Dense(5, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')
print(model.summary())

from keras.callbacks import EarlyStopping
es = EarlyStopping(monitor='loss', patience=5, mode='auto')
model.fit(x, y, epochs=1000, batch_size=1, verbose=0, callbacks=[es])

pred = model.predict(x)
print('예측값 :', pred.flatten())
print('실제값 :', y)

x_new = array([[3, 5, 7]])
new_pred = model.predict(x_new)
print('새로운 예측값 :', new_pred.flatten())


<console>
2022-12-13 16:29:16.224256: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX AVX2
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm (LSTM)                 (None, 3)                 168       
                                                                 
=================================================================
Total params: 168
Trainable params: 168
Non-trainable params: 0
_________________________________________________________________
None
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_1 (LSTM)               (8, 3)                    168       
                                                                 
=================================================================
Total params: 168
Trainable params: 168
Non-trainable params: 0
_________________________________________________________________
None
Model: "sequential_2"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_2 (LSTM)               (8, 2, 3)                 168       
                                                                 
=================================================================
Total params: 168
Trainable params: 168
Non-trainable params: 0
_________________________________________________________________
None
[[ 1  2  3]
 [ 2  3  4]
 [ 3  4  5]
 [ 4  5  6]
 [ 5  6  7]
 [10 20 30]
 [20 30 40]
 [30 40 50]] (8, 3)
[ 4  5  6  7  8 40 50 60] (8,)
[[ 1  2  3]
 [ 2  3  4]
 [ 3  4  5]
 [ 4  5  6]
 [ 5  6  7]
 [10 20 30]
 [20 30 40]
 [30 40 50]] (8, 3)
Model: "sequential_3"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 lstm_3 (LSTM)               (None, 10)                480       
                                                                 
 dense (Dense)               (None, 5)                 55        
                                                                 
 dense_1 (Dense)             (None, 1)                 6         
                                                                 
=================================================================
Total params: 541
Trainable params: 541
Non-trainable params: 0
_________________________________________________________________
None

1/1 [==============================] - ETA: 0s
1/1 [==============================] - 0s 236ms/step
예측값 : [ 4.0012474  4.9936314  5.99559    6.952085   8.063006  39.780865
 49.39792   56.75779  ]
실제값 : [ 4  5  6  7  8 40 50 60]

1/1 [==============================] - ETA: 0s
1/1 [==============================] - 0s 8ms/step
새로운 예측값 : [9.879905]