Python/Tensorflow

[Tensorflow] 파이썬 keras CNN 구현 간단 예제(MNIST 이미지 분류)

jimmy_AI 2022. 6. 17. 20:22
반응형

텐서플로우 케라스로 CNN 모델 코드 구현하기

파이썬에서 Tensorflow 2.x 버전의 케라스 모듈을 활용하여

CNN 모델 구조를 구현하여 MNIST 이미지 분류를 진행하는 예제를 다루어보겠습니다.

 

 

데이터셋 로드

먼저, keras에서 자체적으로 제공하는 MNIST 데이터셋을 가져오고, shape를 확인해보겠습니다.

import tensorflow as tf

mnist = tf.keras.datasets.mnist
(X_train, y_train), (X_test, y_test) = mnist.load_data()

# 0 ~ 255 사이 정수 -> 0 ~ 1 사이 실수로 변환
X_train, X_test = X_train / 255.0, X_test / 255.0

print("X_train shape :", X_train.shape) # X_train shape : (60000, 28, 28)
print("y_train shape :", y_train.shape) # y_train shape : (60000,)
print("X_test shape :", X_test.shape) # X_test shape : (10000, 28, 28)
print("y_test shape :", y_test.shape) # y_test shape : (10000,)

참고로, MNIST 데이터셋의 각 이미지는 28 * 28 픽셀 크기이며, RGB 차원은 따로 없는

흑백 사진으로 구성되어 있습니다.

 

6만 장의 학습용 데이터와 1만 장의 테스트용 데이터로 구성되어 있으며,

라벨의 종류는 0~9의 숫자로 이루어진 10 종류입니다.

 

 

CNN 모델 layer 쌓기

keras.models의 Sequential 기능을 활용하면 layer를 원하는대로 쉽게 쌓을 수 있습니다.

 

Conv - maxpool - Conv - maxpool - fc layer의 구조로 이루어진 간단한 CNN layer를 쌓은

예시 코드는 아래와 같습니다.

from tensorflow.keras import models, layers

model = models.Sequential()

# 필터 5개, 커널 사이즈 = 3 * 3인 convolution layer - maxpooling 조합
model.add(layers.Conv2D(5, 3, strides = 1, padding = 'same', activation = 'relu', input_shape = (28, 28, 1)))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))

# 필터 10개, 커널 사이즈 = 3 * 3인 convolution layer - maxpooling 조합
model.add(layers.Conv2D(10, 3, strides = 1, padding = 'same', activation = 'relu'))
model.add(layers.MaxPooling2D(pool_size=(2, 2)))

# 1차원으로 변환 후 fc layer 통과(64차원 변환 -> dropout -> 10개 클래스 확률 변환)
model.add(layers.Flatten())
model.add(layers.Dense(64, activation = 'relu'))
model.add(layers.Dropout(0.2))
model.add(layers.Dense(10, activation = 'softmax')) # 클래스 10개, softmax 적용하여 각 클래스의 확률로 변환

 

반응형

 

윗 코드에서 유의해야 할만한 부분들을 정리하면 다음과 같습니다.

 

1. 첫 layer에서 input_shape은 크기가 28 * 28 픽셀이고, RGB가 없는 흑백 이미지이므로,

(28, 28, 1)로 지정해야 합니다.(RGB가 있는 경우는 마지막 숫자가 3이어야 합니다.)

 

2. 마지막 Dense layer 부분에서는 유닛 개수를 클래스 개수로 정해야하고 활성 함수를

softmax로 지정해야 한다는 점 등에 유의해주셔야 합니다.

(단, 이진 분류에서는 유닛 개수 = 1, 활성 함수 = sigmoid로 지정해야 합니다.)

 

이 외에는

Conv2D layer 메소드에서 필터 개수와 커널 사이즈의 숫자를 차례대로 지정한 점과

Conv2D의 strides 칸 수, padding 방식, 활성 함수 종류 및

fc layer의 Dense layer 조건이나 Dropout 유무 등은 자유롭게 지정하면 된다는 점 등을

참고해주시면 좋습니다.

 

 

CNN 모델 학습

이제, 윗 과정에서 선언해두었던 CNN 구조를 학습하는 코드를 살펴보겠습니다.

 

아래의 예시 코드를 실행하면 다음과 같이 창이 뜨면서 학습이 진행됩니다.

(optimizer, epochs, batch_size 등 조건은 자유롭게 변경이 가능합니다.)

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

history = model.fit(X_train, y_train, epochs = 5, batch_size = 16, verbose = 1, validation_data = [X_test, y_test])

verbose = 1로 지정하여 학습 결과 창이 위와 같이 출력되도록 하였으며

validation data도 지정하여 테스트 데이터에서의 정확도 성능도 같이 평가한 결과,

98.5% 이상의 테스트셋 정확도를 기록한 점을 알 수 있었습니다.