RNN은 Recurrent Neural Network의 약자이다. RNN은 입력과 출력을 시퀀스 단위로 처리해준다.
RNN은 은닉층 노드의 활성화 함수를 통해 나온 결과값을 출력츨 방향으로 보내면서 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징이 있다. 이 과정을 그림으로 표현하면 다음과 같다.
RNN의 은닉층에서 활성화 함수를 통해 결과를 내보내는 역할을 하는 노드를 셀(cell)이라 한다. 이 셀은 이전 값을 기억하는 메모리의 역할도 수행하므로 메모리 셀 또는 rnn셀 이라 표현한다.
은닉층의 메모리 셀은 각각의 시점에서 이전 시점의 은닉층의 메모리 셀에서 나온 값을 자신의 입력으로 이용하는 재귀적 활동을 하고 있다.
RNN은 다음과 같이 입력과 출력의 길이를 다르게 설계 할 수 있다.
다음은 케라스의 SimpleRNN을 이용하여 RNN을 구현한 코드이다. 데이터셋을 학습시켜 다음에 올 숫자를 예측하는 프로그램이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
from keras import layers
from keras import models
import numpy as np
# make dataset
# 0.1 단위의 실수 배열, x : 학습할 수열, y: 답
x = []
y = []
for i in range(6):
li = list(range(i, i+4))
x.append(list(map(lambda c: [c/10], li)))
y.append((i+4) / 10)
x = np.array(x)
y = np.array(y)
# SimpleRNN : RNN레이어를 만든다. input_shape는 수열 4개 이후 나올 답을 구하기 때문에 [4,1]로 한다.
# Dense : output layer
model = models.Sequential([
layers.SimpleRNN(units=10,
return_sequences=False,
input_shape=[4, 1]),
layers.Dense(1)
])
model.compile(optimizer='adam', loss='mse')
model.fit(x, y, epochs=10000, verbose=1)
print(model.predict(x))
# 테스트용 배열
x_te = np.array([[[0.6],[0.7],[0.8],[0.9]]])
print(model.predict(x_te))
|
cs |
x의 각 배열마다 다음에 올 값인 0.4, 0.5, 0.6, 0.7, 0.8, 0.9에 근접하는 값이 출력 되었고, 테스트 배열의 다음에 올 값인 1.0에 근접하는 값이 출력되었다. 학습 횟수를 10000번으로 설정했지만 이 횟수를 더 늘리면 목표 값에 더 근접한 값이 나올 것이다.
'AI' 카테고리의 다른 글
CNN(합성곱 신경망) (0) | 2021.03.31 |
---|---|
DNN(심층신경망) (0) | 2021.03.29 |
Keras(케라스) (0) | 2021.03.28 |
Tensorflow(텐서플로우) (0) | 2021.03.28 |