앞에서 이어집니다
1. Mnist data 살펴보기
2. Mnist - DNN(Deep Neural Network)로 학습해보기
3. Mnist - CNN으로 학습해서 정확도 높이기
4. 직접쓴 숫자 넣어보기, 연구 적용 고민
본격적으로 CNN을 도입해서 학습결과의 accuracy를 높여보도록 하겠습니다.
필요한 라이브러리를 불러옵니다.
훨씬 더 많은 라이브러리가 필요합니다.
Flatten, Conv2D 등 CNN을 위한 라이브러리도 있고 Dropout 과 같이 over fitting 개선효과가 있는 라이브러리들도 있는 것을 확인 할 수 있습니다.
Mnist set을 불러오고 형태를 정리하는 것은 DNN과 크게 다르지 않습니다. 다만 CNN 은 Dimension을 낮출 필요가 없이 2D나 3D 등의 형태 그대로 넣어 줄 수가 있습니다.
나중에 flatten 층을 통해서 dense 층으로 넘어 갈 수 있습니다.
GPU 옵션 부분은 환경에 따라 GPU 메모리를 학습 이후에도 확보하고 있는 경우가 있길래 넣어뒀습니다.(colab에서는 사용 하든 안하든 문제가 발견되지 않았습니다)
CNN 모델은 convolution 층과 maxpooling 층을 번갈아 가면서 넣었습니다.
첫번째 convolution 층은 5x5 의 사이즈와 (1,1) 의 strides를 가지고 있습니다.
두번째 층은 2x2의 사이즈와 (2,2)의 strides를 가지고 있는데, Hands-on 에서는 이정도만 설명하고 넘어가겠습니다.
이것저것 옵션을 바꾸어 가면서 시도해 볼 수 있습니다.
*CNN 자세한 설명
model.summary() 명령어로 모델의 형태를 확인 할 수 있습니다.
CNN 모델을 학습합니다.
batch-size를 바꿀 수 있고, loss가 수렴하는 형태를 보면서 적당한 epochs를 선정 할 수 있습니다.
무사히 학습되었다면 Test 해봅니다.
accuracy가 0.994 로 이전의 DNN 보다 월등히 높은 수준인 것을 알 수 있습니다.
추가로 loss 그래프와 accuracy 그래프를 그려보겠습니다.
그런데, loss가 아직 덜 수렴한 것 같은 모습이 보입니다.
epoch를 더 높여서 학습을 해보는 것이 좋겠습니다.
다음에서 이어집니다.
1. Mnist data 살펴보기
2. Mnist - DNN(Deep Neural Network)로 학습해보기
3. Mnist - CNN으로 학습해서 정확도 높이기
4. 직접쓴 숫자 넣어보기, 연구 적용 고민
-----------------<CODE>-----------------------------
import sys
import tensorflow as tf
import keras
from keras.utils import np_utils
from keras.datasets import mnist
from keras.models import Sequential
from keras.layers import Dense, Activation, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
from tensorflow.keras import backend
import pandas as pd
import numpy as np
%matplotlib inline
import matplotlib.pyplot as plt
#GPU 옵션
#config = tf.ConfigProto()
#config.gpu_options.allow_growth=True
#sess = tf.Session(config=config)
#Mnist 데이터셋 불러오기
(X_train, Y_train), (X_test, Y_test) = mnist.load_data()
#Train set 과 Test set 정리하기
input_shape = (28, 28, 1)
X_train = X_train.reshape(X_train.shape[0], 28, 28, 1)
X_test = X_test.reshape(X_test.shape[0], 28, 28, 1)
X_train = X_train.astype('float32') / 255.
X_test = X_test.astype('float32') / 255.
Y_train = keras.utils.to_categorical(Y_train, 10)
Y_test = keras.utils.to_categorical(Y_test, 10)
print('X_train shape:', X_train.shape)
print('Y_train shape:', Y_train.shape)
#CNN 모델 만들기
model = Sequential()
model.add(Conv2D(32, kernel_size=(5, 5), strides=(1, 1), padding='same',
activation='relu',
input_shape=input_shape))
model.add(MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
model.add(Conv2D(64, (2, 2), activation='relu', padding='same'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))
model.summary()
#CNN 모델 학습하기
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
hist = model.fit(X_train, Y_train,
batch_size=128,
epochs=20,
verbose=1,
validation_data=(X_test, Y_test))
# Test
loss_and_metrics = model.evaluate(X_test, Y_test, batch_size=32)
print('loss_and_metrics : ' + str(loss_and_metrics))
#loss graph 그리기
fig, loss_ax = plt.subplots()
loss_ax.plot(hist.history['loss'], 'b', label='train loss')
loss_ax.plot(hist.history['val_loss'], 'r', label='test loss')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('loss')
loss_ax.legend(loc='upper right')
plt.show()
#Accuracy graph 그리기
fig, loss_ax = plt.subplots()
loss_ax.plot(hist.history['acc'], 'b', label='train accuracy')
loss_ax.plot(hist.history['val_acc'], 'r', label='test accuracy')
loss_ax.set_xlabel('epoch')
loss_ax.set_ylabel('accuracy')
loss_ax.legend(loc='upper right')
plt.show()
댓글
댓글 쓰기