머신러닝을 구현할 때는 미 가공 데이터를 머신러닝 알고리즘이 처리할 수 있는 형태로 가공시켜야 한다. 이것을 전처리 라고 한다. 데이터 전처리는 파이썬의 numpy 모듈과 sklearn 모듈을 사용한다.

 

샘플 데이터 생성

 

이진화

이진화는 숫자를 이진수로 변환하는 기법이다. 사이킷런 모듈에서 제공하는 메소드로 입력 데이터를 이진화 할 수 있다.

기준 값으로 설정한 2.1보다 큰 값은 1로, 나머지는 0으로 변환된 것을 확인할 수 있다.

 

평균제거

특징 벡터의 값들이 0을 중심으로 분포하게 만들 때 평균 제거 기법을 만들 수 있다.

우선 현재 데이트들의 평균과 표준편차는 다음과 같다.

평균 제거는 preprocessing.scale() 함수로 할 수 있다.

평균값은 0에, 표준편차는 1에 가깝게 조정되었다.

 

크기조정

특징 베터의 각 요소에 대한 값의 범위는 일정하지 않을 수 있다. 머신 러닝 알고리즘을 학습시키려면 모든 특징을 동일 선상에서 비교할 수 있도록 각각의 특징에 대한 값의 범위를 일정한 기준으로 조정해야 한다. 

각 행마다 최댓값은 1로, 나머지는 1을 기준으로 상대적인 값으로 표현하였다.

 

정규화 

특징 벡터의 값을 일정한 기준으로 측정하기 위한 것이다. 대표적인 정규화 기법으로는 총 합이 1이 되도록 값을 조정하는 L1 정규화와 각 행의 절댓값의 합이 1이 되도록 조정하는 L2 정규화가 있다. L1 정규화 기법은 데이터의 이상치(아웃라이어)에 영향을 덜 받기 때문에 더 안정적이며 이상치가 문제 해결에 중요한 역할을 한다면 L2 정규화를 사용하는 것이 낫다.

 

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

CNN은 Convolutional Neural Network의 약자로 주로 이미지 인식에 많이 사용된다. 이미지를 작은 특징에서 복잡한 특징으로 추상화하는 방식이다. 컬러 사진의 데이터는 3차원 형태로 들어오게 되는데, 사진 데이터를 픽셀값을 가진 2차원 행렬로 표현한다. 한 개의 픽셀은 RGB를 의미하는 3개의 색상값을 가지므로 1개의 픽셀은 3차원으로 구성된다.

CNN모델의 구조는 다음과 같다.

Convolution Layer에서 입력 데이터에 필터 적용후 활성화 함수를 반영하여 특징을 추출한다. Pooling Layer에서 Convolution Layer의 출력 데이터를 입력으로 받아서 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용된다.

cnn으로 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
from keras.datasets import mnist
from keras.utils import to_categorical
from keras import layers
from keras import models
 
 
(x_train, y_train), (x_test, y_test) = mnist.load_data()
 
# reshape : 배열 차원 변경
x_train = x_train.reshape((6000028281))
x_train = x_train.astype('float32'/ 255
 
x_test = x_test.reshape((1000028281))
x_test = x_test.astype('float32'/ 255
 
# 배열을 2진 배열로 바꿈
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
 
 
 
model = models.Sequential()
# Conv2D : 컨볼루션 레이어 종류중 하나, 첫번째 인자 : 필터 수, 두 번째 인자 : 커널 행열, 세번째 : 활성화 함수, 네번째 : 이미지 크기, 흑백사진(1)
# MaxPooling2D : 이미지 크기를 2,2로 줄임(과적합을 막기 위함) 
model.add(layers.Conv2D(32, (33), activation='relu', input_shape=(28281)))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
model.add(layers.MaxPooling2D((22)))
model.add(layers.Conv2D(64, (33), activation='relu'))
 
# 2차원 행렬을 다시 1차원으로 바꿔주는 코드, 결과 출력을 위한 레이어
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))
 
# 모델 컴파일, 학습
model.compile(optimizer='rmsprop', loss='categorical_crossentropy', metrics=['accuracy'])
model.fit(x_train, y_train, epochs=2, batch_size=64)
model.evaluate(x_test, y_test)
cs

 

'AI' 카테고리의 다른 글

RNN(순환 신경망)  (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

케라스는 파이썬으로 작성된 오픈소스 신경망 라이브러리 이다. 케라스는 텐서플로우 위에서 동작한다. 

케라스는 빠르게 딥러닝 연구 및 실험을 가능하게 하는데에 중점을 두고 개발되었기 때문에 다음과 같은 특징이 있다.

1. 사용자 친근성

일관성 있고 간단한 API를 제공하며, 일반적으로 필요한 사용자 작업 수를 최소화하며 사용자 오류 시 명확하고 실용적인 피드백을 제공합니다.

2. 모듈성

모델은 가능한 최소한으로 제한하여 독립적으로 생성 가능하다. 신경층, 비용함수, 최적하기, 초기화스킴, 활성함수, 정규화 스킴은 모두 새로운 모델을 생성하기 위해 결합할 수 있는 독립 실행형 모듈이다.

3. 쉬운 확장성

새로운 모듈을 추가하기 쉽다.

4. 파이썬 작업

모델은 작고, 디버그하기 쉽고, 확장성이 용이한 파이썬을 기반으로 두고 있다.

 

'AI' 카테고리의 다른 글

RNN(순환 신경망)  (0) 2021.03.31
CNN(합성곱 신경망)  (0) 2021.03.31
DNN(심층신경망)  (0) 2021.03.29
Tensorflow(텐서플로우)  (0) 2021.03.28

텐서플로우는 2015년 구글에서 오픈소스로 공개한 파이썬 라이브러리로, 여러 CPU및 GPU와 모든 플랫폼, 데스크톱, 모바일에서 사용할 수 있다.

텐서플로우 연산은 상태를 가지는 데이터 흐름 그래프로 표현된다. 또한 C++과 R같은 다른 언어도 지원하여 딥러닝 모델을 직접 작성하거나 케라스 와 같은 래퍼 라이브러리를 사용하여 작성할 수 도 있다.

텐서플로우는 크게 CPU만 지원하는 버전과 GPU를 함께 지원하는 버전으로 제공된다.

NVIDIA의 GPU를 사용하고 있지 않다면 반드시 CPU만 지원하는 버전으로 설치해야 하며 GPU를 지원하는 버전보다 설치가 쉽다는 장점이 있다.

GPU를 함께 지원하는 버전은 CPU에서 실행되는 버전보다 월등히 빠른 성능을 나타낸다. GPU는 NVIDIA GPU만 지원한다.

 

'AI' 카테고리의 다른 글

RNN(순환 신경망)  (0) 2021.03.31
CNN(합성곱 신경망)  (0) 2021.03.31
DNN(심층신경망)  (0) 2021.03.29
Keras(케라스)  (0) 2021.03.28

+ Recent posts