머신러닝

1-7 Google TensorFlow 홈페이지의 Keras MNIST Deep Learning 예제

coding art 2020. 2. 9. 15:01
728x90

Deep Learning 이란 무엇인가? Hidden Layer 란 무엇인가? 이런 개념을 간단히 이해하고 있는가? 앞 장의 예제(http://blog.daum.net/ejleep1/932)를 살펴보면 1X784 데이터와 784X10 웨이트 데이터와 10개의 바이아스를 사용하여 hypothesis states를 계산하고 활성화 함수 Softmax를 적용하여 Cross Entropy Cost 함수를 구성 후 Optimizer를 설정하여 경사하강법을 적용하게 된다. 여기에 Dense(128)처럼 은닉층이 추가될 때 One layer 만큼 Deep 해졌다고 하며 이때에 도입되는 웨이트 매트릭스의 크기가 128X10 이라면 128 만큼 Wide 해졌다고 볼 수 있다. 784X10 웨이트 매트릭스 사용에서 (784X128) (128X10) 이 곱해진 만큼의 웨이트 매트릭스가 사용되는 것이다. 이 웨이트들은 초기에 랜덤넘버를 사용하므로 free parameter라고 부르기도 한다. MNIST 문제는 바이아스 포함 7850개의 파라메터들이 사용되며 128 은닉층이 사용되는 예제에서는 785X128+(128+1)X10=101,770개의 파라메터가 사용되는 셈이다. 파라메터 수가 많을수록 학습효율이 높아지고 인식률이 향상되는 경향이 있다.

 

 

아울러 현재의 Keras MNIST Deep Learning 예제에서 은닉층의 Wide 값을 128에서 900 안팎으로 증가시키면 물론 컴퓨팅 부담이 늘어나지만 지금의 Keras 코드로 얻을 수 있는 최고의 인식률로서 98.2% 수준의 결과를 얻을 수 있다. 참고로 보다 높은 인식률을 얻기 위해서는 CNN(Convolutionary Neural Network) 기법과 앙상블(Ensemble)기법을 함께 적용해야 98.599.5% 인식률이 가능하다.

 

뉴럴 네트워크 구조의 특성상 (785X128) 매트릭스에 의한 은닉층 처리 마지막 단계에서는 활성화 함수(Activation Function)에 의한 Threshold 처리가 반드시 수반된다. 활성화 함수로는 여러 종류가 있지만 중간 단계에서는 Relu 사용이 보편적이며 마지막 단계에서의 확률적 개념에 의한 Classification 작업을 위해서라면 TensorFlow 에서는 반드시 Softmax 로 처리해야 하며 아울러 Cost 함수 구성은 내부적으로 Cross Entropy를 사용하게끔 되어 있다. 활성화 함수 Softmax Cross Entropy Cost 함수의 조합에 관해서는 통계물리학의 microcanonical ensemble 시스템에 대한 볼츠만 확률분포 이론을 근거로 하는 다음 url 주소의 필자의 논의 내용을 참조하도록 하자.

http://blog.daum.net/ejleep1/711

 

Dropout 이라고 하는 것은 MNIST 문제를 뉴럴 네트워크로 처리함에 있어서 앞서 설명한 것처럼 뉴럴 네트워크에서는 연결된 레이어 들 사이를 연결하는 수많은 교차 네트워크로 구성되는데 그 수가 많을수록 정밀한 결과가 얻어질 수 있겠지만 지나치게 Overfitting 된 결과가 얻어짐으로 인해 오히려 인식률이 떨어지는 현상이 발생한다. 이러한 Overfitting 문제를 해결하기 위한 대안으로서 일정한 비율만큼 전체 뉴럴 네트워크의 교차 네트워크를 무작위로 선택하여 끓어줌으로서 Overfitting을 방지함과 동시에 최고의 인식률을 얻을 수 있게 된다.

 

Optimizer 로서는 Gradient Descent (Steeptest Descent)Adam 이 가장 많이 사용된다. 특히 Cost 함수의 거동이 들쑥날쑥할 정도로 불규칙하게 변동하는Stochastic 한 경우 필터링 기능까지 포함하는 Adam을 사용하는 것이 유리하다.

 

MNIST 문제에서는 처음부터 7만개의 데이터를 가지고 6만개는 학습용으로 1만개는 테스트용으로 분류가 되어 있다. 즉 테스트용 데이터 1만개는 학습데이타와 품질은 동일하지만 UNSEEN 데이터로 보면 된다. 위 코드 사례에서 충분한 수준의 학습 횟수가 부여되면 거의 98% 수준의 인식률을 볼 수 있다.

 

마지막 TensrFlow Lite 코드는 학습한 머신 러닝 결과 즉 pretrained 된 학습 결과를 가져다 임베디드 형태의 IOT 디바이스에서 사용하기 위한 처리과정이다. 특히 타겟 디바이스가 안드로이드 스마트폰이라면 배우기가 상당히 까다로운 안드로이드 스튜디오 사용이 불가피하므로 별도로 2장에서 다루어 볼 예정이다.

 

 다음 첨부된 코드는 반드시 TensorFlow 2.0 버전 이상에서 실행하자.

#keras_tf2_mnist_02.py

import tensorflow as tf


mnist = tf.keras.datasets.mnist

 

(x_train, y_train),(x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0

 

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dropout(0.2),
  tf.keras.layers.Dense(10, activation='softmax')
])

 

model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

 

model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)

 

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()
open('mnist.tflite', 'wb').write(tflite_model)