[Anaconda+python] 의상 분류기 만들어서 훈련시키고 테스트하기1(인공신경망)

컴퓨터비전/python|2020. 2. 1. 01:02

윈도우에서 파이썬 언어를 이용해서 어떤 작업을 할 때는 아나콘다를 활용하는 것이 (지금까지 경험으론) 괜찮은 것 같습니다. 또한 주피터 노트북을 이용하면 한줄 한줄 대화식으로 코딩을 해나갈 수도 있구요. 아나콘다를 설치하고, 또 가상환경을 생성하고, 주피터 노트북을 이용하는 법들에 대해서는 이미 좋은 포스팅들이 많으니 그 글들을 참고해주시고, 저는 바로 본론부터 들어가겠습니다. 오늘은 티셔츠, 코트, 바지, 가방 등 10개의 의상을 분류해낼 수 있는 의상 분류기를 만들고 훈련시키고 테스트해보도록 하겠습니다. 텐서플로우와 케라스를 활용할 것입니다. 

 

그럼 한줄 한줄 진행하면서 설명을 덧붙이겠습니다. 그전에 matplotlib와 tensorflow는 아나콘다에 설치되어 있지 않기 때문에 conda install matplotlib tensorflow를 Anaconda prompt에 입력해서 설치해주시기 바랍니다. 설치가 완료되었다면, 이제 다음과 같이 패키지들을 import 해주겠습니다. 

 

 

텐서플로우 버전을 한번 확인해볼까요?

 

 

이제 오늘 의상분류기를 만드는데 사용할 데이터셋을 불러오겠습니다. fashion mnist라는 이름의 데이터셋입니다. 

 

fasion mnist의 클래스 이름들을 다음과 같이 지정해줍니다. 

 

 

훈련셋에 샘플이 몇개인지, 이미지의 크기는 어떤지, 훈련셋의 라벨은 몇개인지, 어떤 라벨값들을 갖고 있는지를 살펴보겠습니다. 

 

총 6만개의 훈련셋을 가지고 있고, 훈련셋의 이미지들은 28x28 사이즈를 갖고 있음을 알 수 있습니다. 또한 각 샘플들은 0에서 9의 라벨값들을 갖습니다.

 

이번에는 테스트셋에 대해서 동일하게 살펴보겠습니다. 

 

 

1만개의 테스트셋을 가지고 있고, 테스트 샘플들도 동일하게 28x28 사이즈의 이미지인 것을 알 수 있습니다. 

 

훈련셋에 속한 이미지가 어떻게 생겼는지 하나 살펴볼까요? 훈련셋 첫번째 이미지를 살펴보겠습니다. 

 

이렇게 생긴 부츠를 Ankle boot라고 하더군요. 여기서 colorbar를 통해 각 픽셀들이 0-255의 값을 갖는다는 것을 알았습니다. 픽셀들이 0-1의 값을 갖도록 255로 나눠주겠습니다. 

 

훈련 데이터셋을 좀 더 들여다볼까요? 25개의 훈련셋 이미지를 살펴보겠습니다. 

 

 

이런 의상들이 들어가있네요. ㅎㅎ 데이터셋 탐색은 여기까지 하고 본격적으로 의상분류기를 만들어보겠습니다. 먼저 분류기가 어떤 구조를 갖게할지 정해줍니다. 

 

Flatten을 이용해서 인풋을 일렬화한 다음에 128개의 뉴런을 갖는 층을 하나 더해줍니다. 활성화 함수로는 ReLU를 사용하도록 했구요. 그 다음에는 분류를 위해 10개의 뉴런을 갖는 출력 층을 더해주고, 활성화 함수로 softmax를 사용했습니다. 은닉(hidden) 층이 단 하나인 아주 간단한 인공신경망(artificial neural network) 모델을 만든 셈입니다.  

 

그 다음에는 어떤 방식으로 모델을 훈련시킬 것인가를 설정해줍니다. adam이란 최적화 방법과 sparse categorical crossentropy 손실 함수(목적 함수)로 설정해줬습니다. 

 

이제 훈련셋을 이용해서 모델을 훈련시킵니다. epoch를 10으로 설정했습니다. 

 

점차적으로 loss는 작아지고, accuracy는 커지는 것을 확인할 수 있습니다. 제대로 훈련되고 있다는 뜻입니다. 

 

자, 이제 이 훈련된 의상분류기가 얼마나 의상을 잘 분류해내는지 테스트해보겠습니다. 

 

0.8817이니 예측 정확도가 나쁘지 않네요.^^ 구조를 좀 더 깊게 만든다던가, epoch를 더 크게 설정해준다던가, 여러 방법으로 성능을 높일 여지가 있어 보입니다. 

 

지금까지 한줄 한줄씩 실행해왔는데, 전체 파이썬 코드는 다음과 같습니다. 군더더기는 지우고 핵심적인 부분만 남겼습니다.^^ 

 

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf
from tensorflow import keras

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

train_images = train_images/255.0
test_images = test_images/255.0

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation=tf.nn.relu),
    keras.layers.Dense(10, activation=tf.nn.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)

 

오늘 이 포스팅을 통해 소개해드리고 싶었던 것은 텐서플로우와 케라스를 이용해서 아주 쉽고 간단히 딥러닝을 이용한 이미지 분류기를 만들어낼 수 있다는 것이었습니다. 끝까지 읽어주셔서 감사합니다. 항상 질문과 지적은 환영합니다. 빠르게 답변드리고 있으니 댓글 남겨주세요.^^

 

 

<참고자료>

[1] https://tensorflow.blog/%EC%9C%88%EB%8F%84%EC%9A%B0%EC%A6%88%EC%97%90-%EC%95%84%EB%82%98%EC%BD%98%EB%8B%A4-%ED%85%90%EC%84%9C%ED%94%8C%EB%A1%9C%EC%9A%B0-%EC%84%A4%EC%B9%98%ED%95%98%EA%B8%B0/, 텐서 플로우 블로그, "윈도우즈에 아나콘다, 텐서플로 설치하기"  

[2] https://zvi975.tistory.com/65?category=755361, Choice comes with responsibility, "Anaconda에 Tensorflow 설치, 사용하기"

[3] https://www.youtube.com/watch?v=AACPaoDsd50&t=347s, edureka!, "Tensorflow Image Classification | Build Your Own Image Classifier In Tensorflow | Edureka"

댓글()