[Win10+Anaconda+python] 의상 분류기 만들어서 훈련시키고 테스트하기2(컨볼루션 신경망)

컴퓨터비전/python|2020. 2. 5. 02:26

지난 시간에 인공신경망을 이용해서 의상을 분류할 수 있는 딥러닝 모델을 만들어봤습니다.

=> https://bskyvision.com/696

 

이 모델은 티셔츠, 코트, 가방, 앵클부츠 등 10개의 의상을 분류할 수 있었습니다. 오늘은 동일한 fashion mnist 데이터베이스를 이용해서 컨볼루션 신경망(convolutional neural network, CNN)을 훈련시켜보겠습니다. CNN은 컴퓨터비전의 사실상 모든 분야의 성능을 획기적으로 개선시킨 알고리즘입니다. 최근의 웬만한 컴퓨터비전 모델은 CNN을 기반으로 해서 만들어졌다고 해도 과언이 아닐 정도죠. 

 

오늘은 바로 전체 코드를 보여드리고 중요부분을 설명하는 식으로 글을 전개해가겠습니다. 지난 시간과 전반적인 코드는 매우 유사합니다.  

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import datasets, layers, models

fashion_mnist = datasets.fashion_mnist # fashion_mnist = keras.datasets.fashion_mnist
(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()

train_images = train_images.reshape((60000, 28, 28, 1))
test_images = test_images.reshape((10000, 28, 28, 1))

train_images = train_images/255.0
test_images = test_images/255.0

model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.Flatten())
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10, activation='softmax'))

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

model.fit(train_images, train_labels, epochs=10)

test_loss, test_acc = model.evaluate(test_images, test_labels)

print('Test accuracy:', test_acc)

 

이 코드를 실행하면 다음과 같은 결과가 출력됩니다. 

 

테스트 정확도가 0.9121이 나왔네요. 지난번에 인공신경망을 이용해서 모델을 만든 것(0.8817)보다 좀 더 좋은 성능을 보입니다. 물론 두 모델 모두 충분히 정교하게 파라미터를 조정하지 않았기 때문에 어떤 것이 fashion mnist에서 더 좋은 성능을 보인다고 단정지을 순 없습니다.^^ 

 

자, 그럼 가장 중요한 부분인 CNN의 구조를 설정한 부분의 코드를 살펴보겠습니다. 

 

 

이 부분을 보시면 오늘 만든 CNN 모델의 구조를 알 수 있습니다. 3개의 컨볼루션 층과 2개의 fully connected(FC) 층으로 구성되어 있음을 알 수 있습니다. 10개의 클래스로 분류하는 모델이기 때문에 마지막 FC층은 10개의 뉴런으로 구성되어 있고, 활성화함수로 softmax 함수를 사용함을 알 수 있습니다. 

 

나머지 부분에 대한 설명은 지난번 포스팅에서 한줄, 한줄 다뤘기 때문에 여기에선 생략하도록 하겠습니다. 항상 질문과 지적은 환영입니다. 최대한 빠르게 답변드리도록 노력하고 있으니 댓글 남겨주세요.^^ 

 

 

<참고자료>

[1] https://www.tensorflow.org/tutorials/images/cnn, tensorflow, "합성곱 신경망"

댓글()