[ keras ]CNN MNIST 예제_python

2021. 3. 24. 23:28DeepLearning_study

이전 포스팅에서 CNN에 대해 간단히 정리해보았습니다.

 

2021.03.24 - [DeepLearning_study] - CNN[합성곱 신경망] 개념, 모델구조

 

CNN[합성곱 신경망] 개념, 모델구조

CNN (Convolutional Neural Networks) CNN은 딥러닝에서 주로 이미지나 영상 데이터를 처리할 때 쓰이며 이름에서 알 수 있다시피 Convolution이라는 전처리 작업이 들어가는 Neural Network 모델을 말한다. CNN의..

keeper.tistory.com


이번에는 keras에서 제공되는 mnist 손글씨 데이터를 가지고 간단한 cnn모델을 구축하여 이미지를 분류하는 예제를 소개해보려 합니다. 워낙 유명한 예제이고 간단하게 높은 accuracy를 뽑아낼 수 있어서 가볍게 CNN을 다뤄볼 때 해보기 좋은 것 같아요.

 

MNIST dataset

먼저 dataset을 살펴보면, 28X28X1의 크기를 가진 이미지 데이터들입니다. 이 데이터들을 가지고 keras를 이용하여 CNN모델을 구축하고 test데이터 이미지의 숫자를 예측하는 것까지 진행해보겠습니다.

 

import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
import numpy as np
np.random.seed(7)

먼저 필요한 패키지들을 import 해줍니다.

 

 

img_rows = 28
img_cols = 28

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

input_shape = (img_rows, img_cols, 1)
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)

data를 로드한 다음 28X28 크기의 matrix를 input shape으로 정의하고 28X28X1로 데이터의 reshape 해줍니다.

 

 

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

num_classes = 10


y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

그다음 x데이터들을 정규화해주고 y 데이터들을 keras.utils.to_categorical을 통해 onehot 벡터로 변경해줍니다.

 

 

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(1000, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
model.summary()

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

다음으로 CNN모델을 구축해줍니다. 

자세한 모델 과정은 아래와 같습니다.

model.summary()

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
hist = model.fit(x_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

 

model구축 후, batch_size=128 epochs=12로 학습을 시켜줍니다. 학습 후 loss와 accuracy도 출력해 보았습니다.

 

import matplotlib.pyplot as plt

n = 0
plt.imshow(x_test[n].reshape(28, 28), cmap='Greys', interpolation='nearest')
plt.show()

print('The Answer is ', model.predict_classes(x_test[n].reshape((1, 28, 28, 1))))

마지막으로 test데이터중 하나를 예측해보았습니다.

 

사용된 전체 코드는 아래와 같습니다.

import sys
import tensorflow as tf
import keras
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten
from keras.layers.convolutional import Conv2D, MaxPooling2D
import numpy as np
np.random.seed(7)
img_rows = 28
img_cols = 28

(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

input_shape = (img_rows, img_cols, 1)
x_train = x_train.reshape(x_train.shape[0], img_rows, img_cols, 1)
x_test = x_test.reshape(x_test.shape[0], img_rows, img_cols, 1)

x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.

print('x_train shape:', x_train.shape)
print(x_train.shape[0], 'train samples')
print(x_test.shape[0], 'test samples')

num_classes = 10


y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)
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(1000, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(num_classes, activation='softmax'))
print(model.summary())

model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
hist = model.fit(x_train, y_train, batch_size=128, epochs=12, verbose=1, validation_data=(x_test, y_test))

score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])


import matplotlib.pyplot as plt

n = 0
plt.imshow(x_test[n].reshape(28, 28), cmap='Greys', interpolation='nearest')
plt.show()

print('The Answer is ', model.predict_classes(x_test[n].reshape((1, 28, 28, 1))))

저번에 이어서 CNN모델 예제까지 실습해보았습니다 :-D

반응형

'DeepLearning_study' 카테고리의 다른 글

CNN[합성곱 신경망] 개념, 모델구조  (0) 2021.03.24