MNIST database 

- 손으로 쓴 숫자들로 이루어진 대형 데이터 베이스이며, 다양한 화상 처리 시스템을 training하기 위해 일반적으로 사용됨

- 60,000개의 트레이닝 이미지와 10,000개의 테스트 이미지 포함

- NIST의 테스트 데이터셋으로부터 취합됨  

※NIST

더보기

NIST

28x28 픽셀의 바운딩 박스와 앤티엘리어싱 처리되어 그레이스케일 레벨이 들어가 있도록 평준화 되어 있음

KERAS(딥러닝 네트워크를 구축하기 위한 텐서플로의 고수준 API)

- 진입장벽이 낮고, 추상화가 잘 되어 있어 코드 가독성이 높기 때문에 주로 사용

- Backend인 Theano, TesorFlow, CNTK를 골라서 사용 가능

mnist model 구축 및 학습

1. import required modules

import numpy as np
import tensorflow as tf 
from tensorflow import keras
from keras.layers import Dense
from keras.models import Sequential
from keras.datasets import mnist

import mnist 모듈을 통해 data를 준비한다. 

2. load mnist data

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

(X_train, Y_train) : train dataset으로, 60000, 28*28 그레이스케일 이미지의 10digits인 dataset이다. 

(X_test, Y_test) : test dataset으로, trained model을 테스트하기 위한 10000, 28*28 그레이스케일 이미지이다. 

3. Reshape

X_train = X_train.reshape(60000,28*28).astype('float32')/255.0
X_test = X_test.reshape(10000,28*28).astype('float32')/255.0

Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)

60000은  x_train.shape[0]와 동일하고, 28*28은 784이므로 X_train = X_train.reshape(x_train.shape[0],784)라 작성하여도 무방하다. 

x_train.astype('float32'/255.0 : 그레이스케일 color 0~255.0을 0~1로 다시 스케일링 한다는 의미이다. 

keras.utils.to_categorical(Y_train,10) : 10개의 값을 one hot encoding한다는 의미이다. 

4. design model(Architecture) by using Keras Sequential model

model = Sequential()
model.add(Dense(units=4, input_dim=(28*28),activation='sigmoid'))
model.add(Dense(units=10,activation='softmax'))
model.summary() 

Sequential model : 뉴런의 각 레이어가 다음 레이어 위에 쌓이는 모델을 의미한다. 

model.add는 말그대로 model에 레이어를 추가한다는 의미이다. 

Dense는 "Dense 레이어"임을 나타내 주고, fully connected 레이어라고도 한다. 예측할 때 입력이 뉴런의 모든 단일 뉴런으로 전달됨을 의미한다. 

그런 다음 각 뉴런은 어느 정도 활성화(activated)되는데, 활성화 정도는 훈련 중 학습된 가중치, 편향과 활성화 함수(activation function)을 기준으로 한다. 첫번째 레이어에서의 활성화 함수는 "sigmoid"함수이고, 두번째 레이어의 경우 "softmax"이다. 

model.summary() 를 통해 작성한 model의 구조를 확인할 수 있다. 

네트워크 레이어, 출력형태, 파라미터 수를 확인할 수 있다. 네트워크 크기(메모리 용량)은 대부분의 파라미터 수에 따라 달라지며 총가중치와 편향 수를 의미한다. 

5. Compile model

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

model을 compile하는 단계는, 학습 과정에서 사용되는 몇 가지 중요한 인수를 설정하고 훈련할 모델을 준비하는 과정이다. 

optimizer : 훈련 중에 네트워크가 입력을 모델링하도록 조정하는 알고리즘을 지정하고, 여기선 'sgd'를 사용

loss : 훈련 과정에서 네트워크 예측이 실제 값에서 얼마나 멀리 떨어져있는지 계산하기 위해 사용하는 방법을 지정하고, 여기서는 'categorical_crossentropy'함수를 사용, 이 함수를 보통 손실함수라 한다. 이 외에도 mse(Mean Squared Error 평균 제곱 오차법),등이 있다. 

metrics : 모델의 성능을 판단할 때 사용하는 함수를 지정하고, 여기선 'accuracy'함수 사용, 이 외에도 mae(Mean Absolute Error 평균 절대 오차법),등이 있다. 

6. Train designed model

history=model.fit(X_train, Y_train, batch_size=10, epochs=10, validation_split=0.3)

X_train, Y_train : 훈련데이터의 x,y값

batch_size : 배치크기는 정확도를 측정하고 가중치와 편향을 업데이트하기 전에 네트워크에 공급할 훈련 데이터 수를 지정해 주는 것이다. 위의 경우, 10으로 설정했으므로 각 에폭은 네트워크를 10번 업데이트할 것이다. 

epochs : 에폭은 전체 훈련 데이터셋이 훈련 중 네트워크를 통해 몇 번이나 실행될 것인지 지정한다. 따라서 에폭이 클 수록 학습을 더 많이한다. 

validation_split : 검증 데이터셋을 지정한다. 검증 데이터셋의 데이터는 전체 훈련 과정을 마친 네트워크에 투입되어 네트워크의 예측값과 기대 출력값을 비교한다. 

이렇게 Epoch이 10이 될 때까지 실행 후 출력한다. 

loss : loss함수의 출력값. 당연한 얘기지만, 작을수록 좋음. 첫번째 에폭의 loss값과 마지막 에폭의 loss값을 비교하여 개선이 되었는지 판단할 수 있다. 

accuracy : 훈련데이터의 정확도이다. 

val_loss : 검증 데이터에 대한 손실 함수 출력이다. 훈련손실이 검증 손실보다 낮을 경우, 네트워크가 과적합 될 수도 있음을 암시한다. 

val_accuracy : 마찬가지로 검증 데이터에대한 정확도이다. 

 

※ 에폭이 클수록 학습을 더 많이 하니까, 항상 네트워크가 더 좋아질까?

No, 일부 네트워크는 특정 수의 에폭 이후에 훈련 데이터에 과적합될 수도 있다. 과적합이 없는 경우에도 일부 네트워크는 일정량의 훈련 후에 네트워크 개선이 중단되는 경우도 있다. 

따라서, 네트워크가 개선되지 않을 시 훈련하지 않는 것이 좋다. 

7. Evaluate model

loss,accuracy=model.evaluate(X_test,Y_test)

테스트 데이터셋의 손실을 계산하고 출력한다. 정확히, 손실과 정확도를 계산하고 출력하여 모델 예측값이 실제값과 얼마나 차이나는지 계산한다. 

8. draw plot of accuracy

import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'])
plt.plot(history.history['val_accuracy'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['training', 'validation'], loc='best')
plt.show()

 

9. draw plot of loss

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['training', 'validation'], loc='best')
plt.show()

 

 

 

+ Recent posts