본 노트는 개인적인 공부 정리를 위한 블로그 글입니다.
1. KERAS 파이썬 라이브러리
2. Data : MNIST DATA SET
3. Model: Sequential Model
4. Activation Function: softmax
5. Optimizer: rmasprop
6. loss 함수: categroical_crossentropy
7. metric: accuracy
8. 데이터 전처리 과정
9. 실습 코드 및 주석
케라스는 파이썬으로 작성된 고수준 신경망 API로 TensorFlow, CNTK, 혹은 Theano와 함께 사용하실 수 있습니다. 빠른 실험에 특히 중점을 두고 있습니다. 아이디어를 결과물로 최대한 빠르게 구현하는 것은 훌륭한 연구의 핵심입니다.
케라스를 이용하면 확장성있고 간단한 코드 변경으로 신경망 모델을 구축할 수 있다. 또한 다양한 데이터 셋을 제공함으로, 머신 러닝을 처음 접하는 사람이라도 쉽게 접해볼 수 있도록 도와준다.
이번 글에서는 KERAS에서 제공하는 MNIST 데이터 셋을 이용하여 숫자 분류를 학습하는 신경망 예제에서 사용되는 모듈과 함수들을 알아보고, 실제 실습 예제를 통해 머신러닝을 경험해본다.
코딩을 경험해 본 자라면 누구든 콘솔 창에 'Hello World'를 출력해본 적이 있을 것이다. MNIST DATA는 6만개의 숫자를 적은 손글씨 이미지로, Training Data Set과 1만개의 Test Data Set으로 구성되어 있다. 해당 데이터를 이용하여 해결하는 가장 보편적인 알고리즘은 해당 Data Set을 0~9까지의 숫자로 분류하는 것이다. 이 문제는 딥러닝계의 Hello World 예제라고 불릴만큼 가장 보편적인 딥러닝 예제이다.
#from keras.datasets import mnist
from tensorflow.keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()
train_images와 train_labels은 인공지능망 모델 학습에 사용될 데이터 셋입니다.test_images와 test_labels은 모델 검증에 사용될 테스트 데이터 셋이다. train data가 모의고사라면 test data가 실제 시험에 해당하는 셈이다.
데이터들을 직접 출력해서 확인해보자.
train_images.shape
> (60000, 28, 28)
train_images.shape
> 60000
train_labels
> array([5, 0, 4, ..., 5, 6, 8], dtype=uint8)
test_images.shape
> test_images.shape
len(test_labels)
> 10000
test_labels
> array([7, 2, 1, ..., 4, 5, 6], dtype=uint8)
각각의 이미지는 28x28픽셀의 크기를 갖는 데이터로 0~9까지의 범주를 갖으며, train Data Set은 6만개, test Data Set은 1만개의 데이터 개수를 갖는다.
데이터 셋들에 대한 정의가 끝났다면, 학습 모델에 대한 정의가 필요하다. Sequental Model은 Keras에서 정의하는 학습 모델 중 가장 간단한 모델로 각 layer가 순차적으로 연결된 형태를 갖는다.
network = models.Sequential()
Dense Layer는 정의되는 layer의 종류 중 하나로, 조밀하게 연결된 신경망 층이다. Dense Layer는 모든 입력과 모든 출력이 연결되어 있기 때문에 총 weigth은 입력과 출력의 곱과 같다.
Activation Function (활성화 함수) 란, 인공신경망은 다음 레이어로 값을 출력시키기 이전에 hidden layer에 해당하는 비선형 함수를 통과 시키게 되는데, 이때 사용되는 함수가 활성화 함수이다.
활성화 함수로 비선형 함수를 사용해야 하는 이유는, 선형 레이어가 아무리 쌓이더라도 결국 하나의 깊은 레이어로 표현 될 수 밖에 없다. 따라서 입력 값에 대한 출력 값을 비선형으로 만들기 위해 불가피하게 활성화 함수가 비선형 함수일 수 밖에 없다.
이 중 아래 예제에서 사용될 ReLU함수를 살펴보면, ReLU함수는 입력값이 0보다 작으면 출력값으로 0을, 입력값이 0보다 크면 출력값은 x가 된다.
softmax 활성화 함수는 다중 클래스 분류 문제에 주로 적용된다. 입력에 대한 출력 값을 모두 0 ~ 1 사이의 실수로 정규화하기 때문에 출력을 확률로 해석이 가능하다는 특징이 있다. 그렇기 때문에 주로 레이어 중 마지막 레이어에 대한 활성화 함수로 적용되는 경우가 일반적이다.
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))