-
[Tensorflow, Keras] SimpleRNN 실습IT/AI 2022. 10. 19. 20:51
본 포스팅은 "시작하세요. 텐서플로 2.0 프로그래밍" 도서의 내용을 포함하고 있습니다.
RNN 모델을 사용하는 간단한 예제를 학습해봅니다.
앞쪽 4개의 숫자가 주어졌을 때 그 다음에 올 숫자를 예측하는 간단한 예측 모델을 만드는 예제로 Tensorflow에서 제공하는 SimpleRNN 레이어를 사용합니다.
예를 들어, [0.0, 0.1, 0.2, 0.3]와 같은 연속된 숫자가 주어졌을 때 다음에 올 숫자를 예측하는 모델을 생성하고 학습해보는 예제입니다.
Step 1. Library import
import tensorflow as tf import numpy as np
Step 2. Create the dataset
In :X = [] Y = [] for i in range(6): # [0,1,2,3], [1,2,3,4] 같은 정수의 시퀀스 생성 lst = list(range(i,i+4)) # 위에서 구한 시퀀스의 숫자들을 각각 10으로 나눈 다음 저장합니다. # 각 타임스텝(계층)에 숫자가 하나씩 들어가기 때문에 분리해서 배열에 저장합니다. X.append(list(map(lambda c: [c/10], lst))) # 정답에 해당하는 4, 5 등의 정수를 역시 위처럼 10으로 나눠서 저장합니다. Y.append((i+4)/10) X = np.array(X) Y = np.array(Y) for i in range(len(X)): print(X[i], Y[i])
Out :[[0. ] [0.1] [0.2] [0.3]] 0.4 [[0.1] [0.2] [0.3] [0.4]] 0.5 [[0.2] [0.3] [0.4] [0.5]] 0.6 [[0.3] [0.4] [0.5] [0.6]] 0.7 [[0.4] [0.5] [0.6] [0.7]] 0.8 [[0.5] [0.6] [0.7] [0.8]] 0.9
6가지의 시퀀스 데이터가 생성된 것을 확인할 수 있습니다.Step 3. Create the model
In :# 시퀀스 예측 모델 정의 model = tf.keras.Sequential([ 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()
tf.keras.Sequential을 사용하여 SimpleRNN 레이어와 Dense 레이어를 차례대로 쌓습니다.위에서 사용한 SimpleRNN 레이어의 인자는 아래와 같습니다.units : 양의 정수 값, 출력 값 (Hidden state)의 차원
return_sequences : Boolean 값, 마지막 출력 값만 반환할 것인지 전체 계층의 출력 값을 반환할 것인지 결정
input_shape : 입력 데이터의 형태 , [4 , 1]에서 4는 timesteps 즉, 계층의 갯수이고 1은 입력 데이터의 차원자세한 내용은 아래의 tensorflow 공식 문서를 확인 바랍니다.참조 : https://www.tensorflow.org/api_docs/python/tf/keras/layers/SimpleRNN
그리고 정의한 모델의 구조를 그림으로 나타내면 아래와 같습니다.Out :
Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= simple_rnn_1 (SimpleRNN) (None, 10) 120 dense (Dense) (None, 1) 11 ================================================================= Total params: 131 Trainable params: 131 Non-trainable params: 0 _________________________________________________________________
Step 4. Evaulate
In :# 네트워크 훈련 및 결과 확인 model.fit(X, Y, epochs=100, verbose=0) print(model.predict(X))
verbose = 0으로 설정하면 훈련 과정에서의 출력을 생략 가능합니다.
훈련 과정에서 입력으로 넣었던 데이터를 학습된 모델에 다시 넣어 결과를 추론해봅니다.
Out :
1/1 [==============================] - 0s 174ms/step [[0.42851803] [0.5273877 ] [0.62000304] [0.7065458 ] [0.78708935] [0.8615719 ]]
결과를 확인해보면 어느 정도 정답과 비슷한 숫자를 예측한 것을 볼 수 있고(성능이 좋지는 않습니다.), 모델 설계 시 Dense 레이어에 활성화 함수를 넣지 않았기 때문에 모델에서 예측한 결과 값이 그대로 출력되는 것을 확인 할 수 있습니다.학습 시 사용하지 않았던 데이터에 대한 추론도 살펴봅니다.In :# 학습되지 않은 시퀀스에 대한 예측 결과 print(model.predict(np.array([[[0.6],[0.7],[0.8],[0.9]]]))) print(model.predict(np.array([[[-0.1],[0.0],[0.1],[0.2]]])))
Out :1/1 [==============================] - 0s 19ms/step [[0.9298924]] 1/1 [==============================] - 0s 17ms/step [[0.32333395]]
'IT > AI' 카테고리의 다른 글
[순환신경망] LSTM의 개념 (0) 2022.10.20 [Tensorflow, Keras] LSTM 실습 _ 아마존 리뷰 감성 분석(NLP) (0) 2022.10.20 [순환신경망] RNN의 문제점 (기울기 소실, 기울기 폭주 = Gradient Vanishing & Exploding) (1) 2022.10.19 행렬 곱셈 vs 아다마르 곱셈 (Hadamard product vs Matrix multiplication) (0) 2022.10.18 [순환신경망] RNN의 개념 (0) 2022.10.18