본문 바로가기

【5】RNN 기본 다지기/순환 신경망의 출현

예제로 다시 한번 이해하는 RNN구조

RNN을 실습해보자

 

import numpy as np

from matplotlib import pyplot as plt

from tensorflow.keras import datasets, layers, models

 

실습에 사용되는 패키지들이다.

텐서플로우 2.0은 선언하는 것은 생략하고 넘파이, 맷플롯립, 케라스 이렇게 사용된다.

 

이번에는 데이터셋을 호출하지 않고 만들어서 사용한다.

 

data = np.sin( np.pi * np.arange(0, 100)* 2.025 ) + np.random.random(100)

x = np.array([data[i+j] for i in range(len(data)-10) for j in range(10)])

x_train = x[:700].reshape(-1,10,1)

x_test = x[700:].reshape(-1,10,1)

y = np.array([data[i+10] for i in range(len(data)-10)])

y_train = y[:70].reshape(-1,1)

y_test = y[70:].reshape(-1,1)

 

사인(Sin)그래프를 넘파이를 이용하여 만듭니다.

900개의 정보를 가진 사인그래프며 700개는 학습, 200개는 테스트하는데 사용된다.

여기서 노이즈를 섞어 일반적인 그래프가 아닌 굴곡이 심해진 그래프가 된다.

 

model = models.Sequential() 

model.add(layers.SimpleRNN(8,input_shape = (10,1))) 

model.add(layers.Dense(1)) 

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

model.fit(x_train,y_train,epochs=400,verbose=0)

 

이번에는 모델을 만들어보자

사인그래프는 시계열데이터이고 시퀀셜(Sequential)과 잘맞는다.

RNN을 선언할 때는 SimpleRNN이라고 선언을 하면 된다

이전 CNN에서는 뉴럴넷과 바로 연결이 되지 않아 풀링 또는 플래팅으로 형변환후에 사용하였지만 RNN에서는 뉴럴넷과 같은 2차원으로 출력되어 별도의 조치없이 사용 가능하다.

컴파일은 아담과 MSE를 사용했다.

 

학습이 끝났으면 한번 예측을 해볼텐데

 

y_hat = model.predict(x_test)

 

아까 만들었던 테스트값을 predict 명령어를 사용하여 예측값을 가져옵니다.

해당 데이터를 활용해서 그래프를 그리면 아래와 같은 이미지와 비슷한 형태를 띕니다.

 

 

 

파란색은 트레인값, 빨간색은 예측값, 연보라색은 테스트 값이다.

노이즈를 일정패턴으로 준것이 아닌 랜덤으로 주었기 때문에 테스트 값과 예측값은 같을 수가 없다

하지만 빨간색점을 보게 되면 사인그래프와 유사한 것을 알 수 있다.

이 점을 볼 때 학습이 잘 된 것을 알 수가 있다.

 

 

 

 

 


작성자 김강빈 kkb08190819@gmail.com / 이원재 ondslee0808@gmail.com