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: 답
= []
= []
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)
 
= np.array(x)
= 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=[41]),
                            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

DNN은 Deap Neural Network의 약자이다. 은닉 계층이 여러개인 인공신경망을 의미한다.

은닉계층은 신경망의 외부에서 직접 접근할 수 없는 노드들을 의미한다.

제 1 은닉계층의 결과는 출력 계층이 아닌 제 2 은닉계층으로 들어가고, 제 2 은닉계층의 결과도 다음 은닉계층으로 계속 들어갈 수 있다. 이런식으로 다수의 은닉 계층을 활용하면 은닉계층 하나를 활용하는 것 보다 입력값을 더 정교하게 처리할 수 있다.
다음은 dnn을 이용하여 mnist 데이터를 학습시키는 코드이다.

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
33
34
35
36
37
38
39
40
41
import tensorflow as tf
 
# mnist dataset 가져옴(numpy 튜플 배열)
# x_train : 60000개, 학습용
# x_test : 10000개, 테스트용 
# x_train, x_test : 이미지 모양이 있는 unit8 배열
# y_train, y_test : 0~9 까지의 숫자 레이블
(x_train, y_train), (x_test, y_test) = tf.keras.datasets.mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
 
# Sequential 모델 : 각 레이어에 정확히 하나의 입력 텐서와 하나의 출력 텐서가 있는
# 일반 레이어 스택에 적합하다.
#
# layers.Flatten : 입력 이미지의 크기 지정, 1차원 텐서로 펼침(28 * 28 = 784)
# layers.Dense : 첫 번째 레이어에서 제공되는 784개의 값을 128개의 값으로 인코딩, 활성 함수로 relu 사용
# layers.Dropout : 이전 값 128개중 0.2(20%)가 다음 레이어의 입력에서 무시됨, 20% 무시한 값은 4번째 레이어에 입력
# 10개의 값을 softmax 함수를 이용하여 출력
# 최종 출력값은 입력 이미지가 0~9까지의 어떤 숫자를 의미하는지에 대한 각각의 확률
model = tf.keras.models.Sequential([
    tf.keras.layers.Flatten(input_shape=(2828)), # image size
    tf.keras.layers.Dense(128, activation='relu'),
    tf.keras.layers.Dropout(0.2),
    tf.keras.layers.Dense(10, activation='softmax')
])
 
# compile : 학습을 위한 모델 구성
# optimizer : 사용 알고리즘 결정
# adam : 각 파라미터마다 다른 크기의 업데이트를 적용하는 방법
# loss : 손실값에 적용할 함수
# sparse_categorical_crossentropy : 샘플 값이 정수형 자료일 때 사용
# metrics : 학습 및 테스트 중 모델 평가(정확성)
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])
 
# 학습에 사용되는 데이터셋으로 학습함, epoch는 전테 데이터셋에 대해 한 번 학습을 완료한 상태
# 5로 지정했기 때문에 전체 데이터를 5번 사용하여 학습을 거침
model.fit(x_train, y_train, epochs=5)
 
# 모델 평가
model.evaluate(x_test,  y_test, verbose=2)
cs

mnist 데이터 셋은 손글씨 이미지들로 구성되어 있는 데이터 세트로 28x28의 크기를 갖는다. 학습용 데이터셋은 60000개 이고, 테스트용 데이터셋은 10000개로 이루어져 있다.

코드를 실행시키면 학습 진행 과정과 학습후 테스트 했을 때 손실도와 정확도가 출력된다. 정확도는 97.63%이다.

학습 횟수를 2번으로 줄였더니 다음과 같이 정확도가 약간 감소하였다.

 

'AI' 카테고리의 다른 글

RNN(순환 신경망)  (0) 2021.03.31
CNN(합성곱 신경망)  (0) 2021.03.31
Keras(케라스)  (0) 2021.03.28
Tensorflow(텐서플로우)  (0) 2021.03.28

+ Recent posts