인공지능 및 데이터과학/딥러닝 프레임워크

케라스(Keras) #4 - MNIST(손글씨) 분류 및 튜닝하기(구현 편)

Steve Jang 2020. 8. 1. 18:57

다시 기초부터

포스팅 하나당 신경망 하나를 포스팅하는 것은 쓰는 사람도 그걸 받아들이는 사람들 중에 비전공자는 힘들 수 있다. 이미 MNIST(손글씨)와 유사한 Fashion MNIST(패션 아이콘)를 분류하는 모델을 포스팅한 적이 있지만, 하나하나 디테일하게 설명하지 못한 아쉬움이 있다.

 

이번 포스팅부터는 좀 더 쉽게 설명하기 위해서 신경망을 하나하나 코딩할 때마다 해당되는 기술들에 대해서 별도의 포스팅을 작성하고 어떤 방법으로 이루어지는지 써보도록 한다. 그리고 성능을 올리기 위해서 어떻게 튜닝을 하는지 적어보도록 하겠다.

 

 

train에 사용될 매개변수(parameter)들

 

import tensorflow as tf
import numpy as np
from tensorflow import keras

# variables
epochs = 200
batch_size = 128
verbose = 1
validation_split = 0.2

output_class = 10

 

학습 파라메터

epoch

epoch는 학습을 하기 위한 데이터를 몇바퀴 돌려 학습을 시킬 것인지를 지정한다. 즉, epoch를 다른 말로 풀이하면 몇번(혹은 얼만큼 길게...) 학습을 수행할 것인가?와 동일한 의미이다.

 

batch size

많이들 헷갈려 하는것이 배치와 에폭의 차이이다. epoch이 몇번을 돌릴 것인가?라는 개념으로 본다면 batch size는 한번에 입력해야 할 표본의 수이다. 

 

욕조에 물을 빼고 채우는 한번의 행위를 epoch로 본다면 욕조에 물을 빼고 채우기 위해 바가지로 물을 퍼서 나른다면 바가지에 얼만큼의 물을 담느냐가 batch size라 할 수 있다. 

 

verbose

verbose의 값을 조절하여 학습 시 얼만큼의 내용이 표시가 될 것인지 보여준다.

Verbosity mode. 0 = silent, 1 = progress bar, 2 = one line per epoch.

 

validation_split

훈련 프로세스의 유효성을 확인하기 위해서 남겨둔 데이터이며, 비율을 입력하여 검증용 데이터를 남겨둘 수 있다.

 

그외 파라메터

output_class

최종 출력되는 값의 범위를 지정한다. 숫자는 0부터 9의 사이기 때문에 여기(손글씨 분류)에선 10이 고정 값이 된다.

 

 

 

데이터를 불러오기

 

mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

print(X_train.shape)
print(X_test.shape)
(60000, 28, 28)
(10000, 28, 28)

mnist 데이터는 6만개의 train 데이터와 1만개의 test 데이터로 이루어져 있으며, 한개의 데이터는 28, 28의 2차원 배열 형태로 저장이 되어 있다. 즉 가로 28, 세로 28의 흑백 이미지들의 집합이다.

 

mnist dataset

keras.datasets에는 mnist 데이터를 마음껏 쓸 수 있게 되어 있다. 다만 이미 데이터가 내장이 되어 있는 것은 아니고 처음 호출하는 경우 최초에 한해서 데이터를 불러들인다.

 

윈도우 기준으로 사용자 > 윈도우 계정명 > .keras > datasets 폴더안에 데이터를 확인할 수 있으며 파일을 삭제하면 다시 불러들인다

C:\Anaconda3\python.exe C:/Project/steel/source-python/keras_01.py
2020-08-01 17:18:20.995370: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-08-01 17:18:20.995567: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
(60000, 28, 28)
(10000, 28, 28)

이미 datasets에 데이터가 있을 경우 위와 같이 별다른 메세지 없이 진행이 되지만...

 

C:\Anaconda3\python.exe C:/Project/steel/source-python/keras_01.py
2020-08-01 17:26:39.416143: W tensorflow/stream_executor/platform/default/dso_loader.cc:55] Could not load dynamic library 'cudart64_101.dll'; dlerror: cudart64_101.dll not found
2020-08-01 17:26:39.416349: I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not have a GPU set up on your machine.
Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz
11493376/11490434 [==============================] - 2s 0us/step
(60000, 28, 28)
(10000, 28, 28)

mnist가 없다면 위와 같이 mnist.npz를 다운로드한 후 진행이 된다.

 

 

 

데이터를 변환하기

 

mnist는 28 x 28의 흑백 데이터인데 이 데이터를 컴퓨터가 이해하기 쉽게 0과 1사이의 실수 값으로 데이터를 변환하는 것이 좋다.

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

X_train /= 255
X_test /= 255

우선 나누기에 앞서 흑백 데이터는 0~255의 정수값으로 이루어져 있기 때문에 모든 데이터를 255로 나누면 0과 1사이의 실수값으로 데이터가 변환되어진다.

 

변환전

[  0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   3.  18.
  18.  18. 126. 136. 175.  26. 166. 255. 247. 127.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  30.  36.  94. 154. 170. 253.
 253. 253. 253. 253. 225. 172. 253. 242. 195.  64.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.  49. 238. 253. 253. 253. 253. 253.
 253. 253. 253. 251.  93.  82.  82.  56.  39.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.  18. 219. 253. 253. 253. 253. 253.
 198. 182. 247. 241.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  80. 156. 107. 253. 253. 205.
  11.   0.  43. 154.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.  14.   1. 154. 253.  90.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0. 139. 253. 190.
   2.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  11. 190. 253.
  70.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  35. 241.
 225. 160. 108.   1.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  81.
 240. 253. 253. 119.  25.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
  45. 186. 253. 253. 150.  27.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.  16.  93. 252. 253. 187.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0. 249. 253. 249.  64.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
  46. 130. 183. 253. 253. 207.   2.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  39. 148.
 229. 253. 253. 253. 250. 182.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.  24. 114. 221. 253.
 253. 253. 253. 201.  78.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.  23.  66. 213. 253. 253. 253.
 253. 198.  81.   2.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.  18. 171. 219. 253. 253. 253. 253. 195.
  80.   9.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.  55. 172. 226. 253. 253. 253. 253. 244. 133.  11.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0. 136. 253. 253. 253. 212. 135. 132.  16.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.
   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.   0.]

 

변환후

[0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.01176471 0.07058824 0.07058824 0.07058824
 0.49411765 0.53333336 0.6862745  0.10196079 0.6509804  1.
 0.96862745 0.49803922 0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.11764706 0.14117648 0.36862746 0.6039216
 0.6666667  0.99215686 0.99215686 0.99215686 0.99215686 0.99215686
 0.88235295 0.6745098  0.99215686 0.9490196  0.7647059  0.2509804
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.19215687
 0.93333334 0.99215686 0.99215686 0.99215686 0.99215686 0.99215686
 0.99215686 0.99215686 0.99215686 0.9843137  0.3647059  0.32156864
 0.32156864 0.21960784 0.15294118 0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.07058824 0.85882354 0.99215686
 0.99215686 0.99215686 0.99215686 0.99215686 0.7764706  0.7137255
 0.96862745 0.94509804 0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.3137255  0.6117647  0.41960785 0.99215686
 0.99215686 0.8039216  0.04313726 0.         0.16862746 0.6039216
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.05490196 0.00392157 0.6039216  0.99215686 0.3529412
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.54509807 0.99215686 0.74509805 0.00784314 0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.04313726
 0.74509805 0.99215686 0.27450982 0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.13725491 0.94509804
 0.88235295 0.627451   0.42352942 0.00392157 0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.31764707 0.9411765  0.99215686
 0.99215686 0.46666667 0.09803922 0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.1764706  0.7294118  0.99215686 0.99215686
 0.5882353  0.10588235 0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.0627451  0.3647059  0.9882353  0.99215686 0.73333335
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.9764706  0.99215686 0.9764706  0.2509804  0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.18039216 0.50980395 0.7176471  0.99215686
 0.99215686 0.8117647  0.00784314 0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.15294118 0.5803922
 0.8980392  0.99215686 0.99215686 0.99215686 0.98039216 0.7137255
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.09411765 0.44705883 0.8666667  0.99215686 0.99215686 0.99215686
 0.99215686 0.7882353  0.30588236 0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.09019608 0.25882354 0.8352941  0.99215686
 0.99215686 0.99215686 0.99215686 0.7764706  0.31764707 0.00784314
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.07058824 0.67058825
 0.85882354 0.99215686 0.99215686 0.99215686 0.99215686 0.7647059
 0.3137255  0.03529412 0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.21568628 0.6745098  0.8862745  0.99215686 0.99215686 0.99215686
 0.99215686 0.95686275 0.52156866 0.04313726 0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.53333336 0.99215686
 0.99215686 0.99215686 0.83137256 0.5294118  0.5176471  0.0627451
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.         0.         0.
 0.         0.         0.         0.        ]

 

원핫 인코딩(One-Hot Encoding)

 

우선 원핫 인코딩에 대해서 잘 모르는 상태이면 하단의 원핫 인코딩의 포스팅을 먼저 보고오도록 하자

원핫 인코딩(One-Hot Encoding) 개념과 구현해보기

 

학습을 위한 데이터를 변환했다면 이제 최종적으로 출력해야 될 데이터를 정의해야 한다. 숫자는 0부터 9까지의 값으로 이루어져 있기 때문에 총 10개로 이루어진 원핫 인코딩을 생성하여 출력 레이블을 만든다.

 

Y_train = tf.keras.utils.to_categorical(Y_train, output_class)
Y_test = tf.keras.utils.to_categorical(Y_test, output_class)

print(Y_train)
[[0. 0. 0. ... 0. 0. 0.]
 [1. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 1. 0.]]

 

 

모델 생성 및 구축, 컴파일

 

지금까지의 모든 작업을 모델에 데이터를 넣기 위한 전처리 작업이었으며 이제 모델을 잘 설계해서 데이터의 효율성을 극대화하는 작업을 수행하면 된다. 우선 이번 포스팅을 매우 간단하고 심플한 분류 모델을 구현할 것이기 때문에 튜닝에 대한 고려없이 모델을 생성, 구축한다.

 

모델 생성 및 구축

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

keras에서 여러가지 방법으로 모델을 만드는 방법이 있지만, 여기서는 가장 기본적인 Sequential로 모델을 구축하였다.

 

MNIST 데이터를 학습하기 위해서 우선 28 x 28의 데이터를 컴퓨터가 읽을 수 있게 1차원 배열 값으로 변경해야 한다. reshape를 사용하여 1차원 배열값으로 변경한 후 데이터를 넣는 방법도 있지만 keras에서는 Flatten 함수를 호출하여 쉽게 처리할 수 있다.

 

데이터를 평평하게(1차원으로) 만들었다면, 이제 레이어를 정의해야 하는 단계가 남았다. Dense라는 명령어는 본격적으로 레이어를 생성하게 되며, 첫번째 덴스의 128은 히든노드를 뜻하며, activation을 활성화 함수를 지정하는 것이다.

 

활성화 함수에 대해서 이해를 하지 못한 분들은 하단의 활성화 함수에 대해서 정리한 포스팅을 보고 오도록 하자

[딥러닝] 대표적인 활성화 함수(Activation function) 소개

 

첫번째 Dense는 128개의 노드로 값을 처리하고, 활성화 함수는 보편적인 ReLU 함수를 사용하여 0이하의 값은 0으로 0을 초과하는 값은 그대로 보존하는 방식을 쓰겠다는 의미이다. 이렇게 첫번째 Dense에서 연산을 했다면 두번째 출력레이어로 전달한다.

 

출력 레이어는 10개의 노드로 이루어져 있으며, 각각의 값은 0부터 9의 숫자를 의미한다. 확률로 이루어져야 하기 때문에 활성화 함수를 softmax를 사용하였다. 

 

모델 컴파일(Compile)

모델을 설계했다면 설계된 모델을 구현하는 것이 컴파일 단계이다. 

model.compile(optimizer='SGD',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

모델 컴파일에 사용되는 개념들은 다음 포스팅에서 하도록 하며, SGD라는 optimizer는 확률적 그래디언트 하강(Stochastic Gradient Descent)이라는 optimizer로 기본적인 최적화 알고리즘이다. loss는 다중 분류에 사용하는 categorical_crossentropy를 사용하며, 측정 항목으로는 정확도(accuracy)를 사용한다고 명시하였다.

 

 

학습 및 평가

 

모델 학습

model.fit(X_train, Y_train,
          batch_size=batch_size, epochs=epochs,
          verbose=verbose, validation_split=validation_split)

compile을 했으면 이제 본격적으로 데이터를 넣고 학습을 하는 과정을 진행해야 한다. 바로 이전까지 설계를 하고 껍데기를 만들었다면 이제 속을 채우는 과정을 진행한다. 학습에 사용한 파라미터는 상단에 이미 설명한 내용이기 때문에 넘어가도록 한다.

 

모델 평가

test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy: ', test_acc)
Epoch 50/50
375/375 [==============================] - 1s 2ms/step - loss: 0.1588 - accuracy: 0.9555 
- val_loss: 0.1657 - val_accuracy: 0.9547
313/313 [==============================] - 0s 1ms/step - loss: 0.1625 - accuracy: 0.9543
Test accuracy:  0.9542999863624573

 

학습이 마무리 되면, 최종적으로 모델의 성능을 평가하는 단계가 남아있다. model.evaluate에 테스트 데이터를 넣으면 loss와 accuracy를 알 수 있다. 여기서 loss는 손실에 대한 개념으로 결과값에 대한 차이를 의미하며, accuracy는 정확하게 맞췄는지를 평가한다.

 

loss값은 0값에 가까울수록 좋은 모델이며, accuracy는 1에 가까울수록 좋은 모델이다. 학습을 진행하면서, 학습 데이터의 정확도는 0.9555가 나왔고, 검증용 데이터는 0.9547 그리고 최종 테스트 데이터는 0.9542가 나왔으며, 학습과 테스트의 정확도가 유사하다는 것은 과적합 없이 학습이 매우 잘되었다는 것을 의미한다.

 

 

최종 소스

 

import tensorflow as tf
import numpy as np
from tensorflow import keras

# variables
epochs = 50
batch_size = 128
verbose = 1
output_class = 10

validation_split = 0.2

# mnist 데이터를 로드한다
mnist = keras.datasets.mnist
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# 입력을 0~1 사이로 전처리 수행
X_train /= 255
X_test /= 255

# 레이블을 원핫 인코딩
Y_train = tf.keras.utils.to_categorical(Y_train, output_class)
Y_test = tf.keras.utils.to_categorical(Y_test, output_class)

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

# model 요약
model.summary()

# model compile
model.compile(optimizer='SGD',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

# model 학습
model.fit(X_train, Y_train,
          batch_size=batch_size, epochs=epochs,
          verbose=verbose, validation_split=validation_split)

# model 평가
test_loss, test_acc = model.evaluate(X_test, Y_test)
print('Test accuracy: ', test_acc)

 

#텐서플로우 #tensorflow #keras #케라스