가정

이 글는 C,C++,C#,java,python등의 프로그래밍 언어를 쓸 줄 아는 사람이 읽는다고 가정합니다.

설정

  • python를 설치한다.
  • python을 설치한 후에 커맨드라인(cmd, 혹은 파워쉘)에서 'pip install tensorflow'를 입력하여 tensorflow를 설치한 후에, 'pip install keras'를 입력하여 keras를 설치한다.
  • 그다음 소스파일을 새로 만든 후 시작 부분에 꼭 다음 라이브러리를 임포트하자
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation
import numpy

훈련시킬 데이터를 세팅하자

다른 강좌를 보면 이미 있는 붓꽃이나 숫자인식 데이터셋을 사용한다. 그러나 실제로 사용할 데이터셋을 어떻게 만들어야 할지 모르는 경우가 많다. 그러니 직접 만들어야 한다. 만약에 입력 속성이 2개라면 다음과 같이 numpy배열을 만들어야 한다.

train_data = numpy.array([[1, 2], [3, 4], [5, 6])

실제 쓸 데이터셋은 수십만개일 수도 있기 때문에 때려박지 않고 일반적으로 파일을 로드한다. 그럴 경우에도 이런식으로 2차 배열로 만들어 줘야 한다.

결과값을 세팅하자

넣을 데이터를 만들었으면 이제 각 행이 어떤 것지를 설명하는 라벨(혹은 클래스, 분류)를 만들어 줘야 한다. 만약 한 라벨에 대해서 예/아니오만을 판별하려면 다음과 같이 해야 한다.

train_data = numpy.array([1, 0, 0])

중요하면 이 라벨의 갯수은 데이터셋의 행의 갯수와 동일해야 한다.

만약에 여러 분류가 있고, 이로 분류하려는 경우 다음과 같이 한다.

from keras.utils import np_utils
train_labels =np_utils.to_categorical([1,2,3])

이렇게 하면 열이 4개고 행이 3개인 배열을 생성하는데, 배열은 다음과 같이 생겨먹게 된다.

0 1 0 0
0 0 1 0
0 0 0 1

이렇게 되면 0번째 열이 필요없는데도 아깝다. 1 base를 0 base로 바꿔주자. 단순히 저기서 수만 바꾸면 되긴 하지만, 데이터가 많아 파일에서 읽은 것을 파일을 열고 수정하기에는 손이 아플 것이다. 다음처럼 해주자.

from keras.utils import np_utils
labels = [1,2,3]
train_labels =np_utils.to_categorical([item - 1 for item in labels])

모델을 만들자

모델은 간단하게 추측 머신이다. 이 추측 머신이 추측을 할 수 있기 위해서는 훈련을 시켜야 한다. 우리는 이미 위에서 훈련을 위한 데이터를 준비했다.

model = Sequential()
model.add(Dense(1024, input_dim=2, activation="sigmoid"))
model.add(Dense(512,  activation="sigmoid"))
model.add(Dense(128,  activation="sigmoid"))
model.add(Dense(units=1, activation='sigmoid'))
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy'])

이렇게 하면 추론머신의 구성을 어떻게 할 지를 보여주는 것이다.

  1. 각 Dense는 층을 뜻하며 각 층에 뉴런을 몇 개를 할것인지를 정한다. 활성화함수는 여러가지가 있지만 보편적으로 sigmoid가 쓰인다.
  2. 첫 줄의 Dense눈 input_dim이 있는데 이게 바로 입력할 속성의 갯수이다. 이 입력할 속성의 갯수는 데이터셋의 열의 수와 일치해야 한다.
  3. 마지막 줄의 unit는 결과값을 보여주는 출구다. 역시 이 출구 또한 라벨의 열의 갯수와 일치해야 한다.
  4. compile메소드는 이제 추론머신을 정말로 구현한다. CPU에서 작업하는 추론모델이 기본이지만 세팅에 따라 요즘 핫한 그래픽카드의 성능을 빌리는 CUDA를 이용하여 GPU에서 작업하게 만들 수도 있다.

훈련(learning)시키자

이제 추론머신을 만들었으니 훈련을 시켜야 한다. 훈련은 다음과 같이 시킨다.

hist = model.fit(train_data, train_labels, epochs=5, batch_size=1024 * 10)
print('## training loss and acc ##')
print(hist.history['loss'])
print(hist.history['acc'])

epochs는 훈련 데이터로 훈련을 몇 번 반복시킬 것인지 정한다. 일반적으로 많이하면 일정이상 추론 적중률이 높아지다가 정체되는 것을 볼 수 있다.

추론머신을 사용해보자

훈련도 시켰으니 이제 사용해야 한다. 다음과 같이 사용한다.

predictions = model.predict(test_data)

테스트 데이터 또한 입력 데이터이기 때문에 2차원 행렬의 열의 수는 input_dim의 값과 동일해야 한다.

이렇게 하면 predictions에는 test_data의 행만큼의 추론값이 나오는데 라벨의 갯수에 따라 결과를 보는 방법이 다르다.

라벨의 갯수가 하나일 때

라벨의 갯수가 하나일 때, 즉 Yes또는 No인지를 추론한 결과는 실수요소인 배열이 들어온다. 그럼 Yes인지 No인지를 구분할 수 있는 값이 필요한데 이를 threshold(문턱값)이라 부른다. 이 문턱값은 임의로 정해도 좋고 다시 테스트 데이터셋과 라벨짝 이용해서 가장 적중률이 높은 threshold값을 정할 수도 있다.

만약 문턱값이 0.5라 하면 다음과 같이 추측값을 얻는다.

predictions = [item >= 0.5 for item in predictions]

라벨의 갯수가 여러 개일 때

이때는 라벨의 갯수가 열의 갯수이고 데이터의 갯수가 행의 갯수인 행렬이 나온다. 이 때, 한 행의 각 값은 해당 데이터가 그 라벨일 확률이다. 일반적으로 그 확률이 가장 높은 것을 골라주면 된다. 그렇게 하여 바꿔주는 방법은 다음과 같다.

predictions= [numpy.argmax(row) for row in predictions]

자 여기까지 하면 가장 기초적인 딥러닝을 할 수 있게 된 것이다.