Machine Learning/Tensorflow

[순환 신경망] SimpleRNN

욜스터 2021. 1. 15. 21:52
728x90

SimpleRNN 

가장 간단한 형태의 RNN 레이어

 

x: 입력값, h: 출력값, U와 W는 입출력에 곱해지는 가중치

활성화 함수로는 tanh가 쓰인다. (ReLU 같은 다른 활성화 함수를 사용할 수도 있음)

 

레이어 생성 코드

rnn1 = tf.keras.layers.SimpleRNN(units=1, activation='tanh', return_sequences=True)

units: 뉴런의 수, return_sequences: 시퀀스 전체를 출력할지 여부 (여러 개 RNN레이어 쌓을 때 쓰임)

 

예제

[0.0, 0.1, 0.2, 0.3]이라는 연속된 숫자가 주어졌을 때 [0.4]를 예측하는 네트워크를 만들자

 

-학습 데이터 생성

X=[]
Y=[]
for i in range(6):
   #정수 시퀀스 만들기
   lst = list(range(i, i+4))

   #구한 시퀀스의 숫자들을 각각 10으로 나눈 다음 저장
   #simpleRNN에 하나씩 숫자가 들어가기 떄문에 분리해서 배열에 저장
   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])

-학습 모델 만들기

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()

input_shape의 [4,1]는 각각 timesteps, input_dim을 나타낸다.

타임스텝: 순환 신경망이 입력에 대해 계산을 반복하는 횟수

input_dim: 입력 벡터의 크기

=>X는 [1,4,1]차원 벡터

4 타임스텝에 걸쳐 입력받고, 마지막에 출력값을 다음 레이어로 반환

추가한 dense 레이어는 별도 활성화 함수 X = h3은 바로 y3이 된다.

이 값과 0.4의 차이가 mse가 된다. (mean squared error)

 

-훈련

model.fit(X, Y, epochs=100, verbose=0)
print(model.predict(X))

verbose = 0: 훈련 과정에서의 출력이 나오지 않게 함 (출력 볼 필요없고 훈련만 시키고 싶을때 유용)

 

얼추 비슷하게 예측하고 있음을 확인 할 수 있다. 

 

그렇다면 학습과정에서 본 적이 없는 테스트 값을 넣어보자

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]]])))

 

 

결과를 개선하려면 훈련 데이터를 더 많이 넣어주는 것이 좋다. 하지만 많은 값을 훈련데이터에 넣더라도 테스트 데이터에 대한 시퀀스를 정확히 예측하게 하는 것은 쉬운 문제가 아니다.

 

 

SimpleCNN은 가장 간단한 형태이며 빠르게 모델 만들어볼 때 유용하다.

 

728x90
반응형

'Machine Learning > Tensorflow' 카테고리의 다른 글

[순환 신경망] 긍정, 부정 감정 분석  (0) 2021.01.27
[순환신경망]GRU 레이어  (0) 2021.01.25
[순환 신경망] LSTM 레이어  (0) 2021.01.15
순환 신경망 (RNN)  (0) 2021.01.15