Coding Is My Life

코딩은 인생

파이썬 머신러닝

[ML/AI][SimpleRNN with Keras]

산기대 컴공 2022. 9. 20. 04:52
728x90

RNN

RNN은 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징을 갖고있습니다.

x는 입력층의 입력 벡터, y는 출력층의 출력 벡터입니다. RNN에서 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(Cell)이라고 하고 이전의 값을 기억하는 메모리 역할을 하므로 메모리 셀이라고 표현합니다.

현재 시점 변수를 t로 표현

t 시점의 메모리 셀은 t-1 시점의 메모리 셀이 보낸 은닉 상태값을 t 시점의 은닉 상태 계산을 위한 입력값으로 사용

뉴런 단위로 시각화

Keras SimpleRNN

위에서 설명했듯이 이전 timestep의 출력이 다음 timestep으로 완전히 연결된 모델을 keras에서는 simpleRNN으로 모델을 구성 할 수 있습니다. 

필요한 라이브러리 import

1
2
3
4
5
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
from keras.layers import SimpleRNN, LSTM, Bidirectional,Dense
from keras.models import Sequential
cs

임의의 입력값 생성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def MakeDataset(data,window_size = 10):
    x,y = [],[]
    for i in range(len(data) - window_size):
        x.append(data[i:i+window_size])
        y.append(data[i+window_size])
    return np.array(x),np.array(y)
= np.arange(01000)
= np.sin(0.02 * t) + np.random.rand(1000)
train, test = x[0:800], x[800:1000]
 
x_train,y_train = MakeDataset(train)
x_train = x_train.reshape(x_train.shape[0],x_train.shape[1],1)
 
x_test, y_test = MakeDataset(test)
x_test = x_test.reshape(x_test.shape[0],x_test.shape[1],1)
cs

RNN은 2D입력이 아니라 3D를 입력으로 받기 때문에 데이터를 3D로 만들어 주었다.

입력            출력

x1,x2,x3,x4 -> x5

x2,x3,x4,x5 -> x6

x1,x2,x3,x4가 입력으로 들어오면 x5을 출력값 나오도록 데이터를 구성해주었다.

위와 같은 작업을 거치면 (790,10)와 같은 2D데이터가 생성되는데 3D 데이터가 필요하므로 차원을 그냥 하나의 차원을 하나 더 생성해주어서 (790,10,1)으로 3차원 데이터를 생성해주었다.

 

모델 구성

1
2
3
4
5
6
7
8
9
10
11
model = Sequential()
model.add(
    SimpleRNN(
        units=32,
        input_shape = (x_train.shape[1],x_train.shape[2]),
        activation = 'relu'
    )
)
model.add(Dense(8,activation='relu'))
model.add(Dense(1))
model.compile(loss='mse', optimizer='adam', metrics=['acc'])
cs

units : 출력 뉴런 수

input_shape : input으로 들어오는 데이터 shape

activation : 해당 층의 활성화 함수

Dense : 머신러닝 모델 layer

loss : 손실함수

optimizer : 학습 방법

모델 학습

1
model.fit(x_train,y_train,epochs=100,batch_size=16)
cs

모델  성능 평가

1
2
3
from sklearn.metrics import mean_squared_error
pred = model.predict(x_test)
print(mean_squared_error(y_test,pred))
cs

 

수치 데이터이기 때문에 acc 보다는 mse가 적합하다고 생각해서 mean_squared_error를 사용하여 모델의 성능을 평가함

 

실제 데이터와 예측 데이터 비교

1
2
3
plt.plot(y_test,label = "test")
plt.plot(pred,label = "pred")
plt.legend()
cs

 

728x90