본문 바로가기
AI | 딥러닝/Coding

[딥러닝 프로젝트] 1. 신경망 훈련: 기초적인 분류 문제 (Feat. TensorFlow)

by 고뭉나무 2021. 8. 25.

 

딥러닝 프로젝트로 하나씩 실습을 해볼 예정이다. 

첫번째 포스팅으로는 Fashion MNIST를 이용한 기초적인 분류 문제이다.

 

 

테스트 환경

  • 실습 IDE: Google Colab
  • 사용 언어: TensorFlow (Keras) 2.6.0
  • 딥러닝 모델: CNN의 FC영역만 (Flatten, Dense layer)

 

1.  필요한 Library 선언

# tensorflow와 tf.keras를 임포트합니다
import tensorflow as tf
from tensorflow import keras

# 헬퍼(helper) 라이브러리를 임포트합니다
import numpy as np
import matplotlib.pyplot as plt

print(tf.__version__)


2. MNIST Dataset import하기

#Fashion MNIST

fashion_mnist = keras.datasets.fashion_mnist

(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()​

 

Fashion MNIST Download

Dataset 다운로드 완료.

 

 

Fashion MNIST

http://yann.lecun.com/exdb/mnist/


Name Content Examples Size Link MD5 Checksum
train-images-
idx3-ubyte.gz
training set images 60,000 26 MBytes Download 8d4fb7e6c68d591d4c3dfef9ec88bf0d
train-labels-
idx1-ubyte.gz
training set labels 60,000 29 KBytes Download 25c81989df183df01b3e8a0aad5dffbe
t10k-images-
idx3-ubyte.gz
test set images 10,000 4.3 MBytes Download bef4ecab320f06d8554ea6380940ec79
t10k-labels-
idx1-ubyte.gz
test set labels 10,000 5.1 KBytes Download bb300cfdad3c16e7a12a480ee83cd310

https://github.com/zalandoresearch/fashion-mnist

이미지는 28 x 28 크기의 Numpy 배열,

픽셀 값은 0 ~ 255 사이

Label은 0 ~ 9 까지의 정수 배열 (옷을 종류별로 구분하는 용도)

 

 

3.  데이터 탐색

#Data set 크기와 갯수 확인하기 (Data set 구조)
#Train과 Test 로 나눔

Data set  구조


4.  데이터
전처리

#네트워크 훈련하기 전에 필요한 작업

plt.figure()
plt.imshow(train_images[0])
plt.colorbar()
plt.grid(False)
plt.show()

출력 값


#픽셀 0~1 사이로 만들기

train_images = train_images / 255.0

test_images = test_images / 255.0

 

 

5.  모델 구성

1) 설정
#Flatten #Dense

 

model = keras.Sequential([
    keras.layers.Flatten(input_shape=(28, 28)),
    keras.layers.Dense(128, activation='relu'),
    keras.layers.Dense(10, activation='softmax')
])

 

영상을 일차원으로 바꿔주는 Flatten Layer
이 네트워크의 첫 번째 층인 tf.keras.layers.Flatten은 2차원 배열(28 x 28 픽셀)의 이미지 포맷을 28 * 28 = 784 픽셀의 1차원 배열로 변환한다. 이 층은 이미지에 있는 픽셀의 행을 펼쳐서 일렬로 늘린다. 이 층에는 학습되는 가중치가 없고 데이터를 변환하기만 한다.

입력과 출력을 모두 연결해주는 Dense Layer (Aka. Fully Connected Layer)

픽셀을 펼친 후에는 두 개의 tf.keras.layers.Dense 층이 연속되어 연결된다. 이 층을 밀집 연결(densely-connected) 또는 완전 연결(fully-connected) 층이라고 부른다.

첫 번째 Dense 층은 128개의 노드(또는 뉴런)를 가진다. (입력 뉴런: 784개, 출력 뉴런: 128개)

두 번째 (마지막) 층은 10개의 노드의 소프트맥스(softmax) 층이다. 이 층은 10개의 확률을 반환하고 반환된 값의 전체 합은 1이다. 각 노드는 현재 이미지가 10개 클래스 중 하나에 속할 확률을 출력한다. (입력 뉴런: 128개, 출력 뉴런: 10개)

참고: 사이트1, 사이트2

 

※보통 전체 딥러닝 모델은 두 레이어 이전에 Convolution layer 와 Max pooling layer를 번갈아 n번 수행하며 'Feature extraction'을 하고 그 다음 'Classification'을 위해서 위의 두 레이어를 진행한다. 이번 실습에서는 간략하게 진행하고자 'Classification'만 진행한 것이라고 보면 된다. 자세한 내용은 아래 참조.

2021.07.11 - [AI | 딥러닝/Concept] - [딥러닝 모델] CNN (Convolutional Neural Network) 설명

 


2) 모델 컴파일
#Loss function #Optimizer #Metrics

모델을 훈련하기 전에 필요한 몇 가지 설정이 모델 컴파일 단계에서 추가된다:

 

  • 손실 함수(Loss function): 훈련 하는 동안 모델의 오차를 측정함. 모델의 학습이 올바른 방향으로 향하도록 이 함수를 최소화해야 함.
  • 옵티마이저(Optimizer): 데이터와 손실 함수를 바탕으로 모델의 업데이트 방법을 결정함.
  • 지표(Metrics): 훈련 단계와 테스트 단계를 모니터링하기 위해 사용함. 다음 예에서는 올바르게 분류된 이미지의 비율인 정확도를 사용함.
model.compile(optimizer='adam',
              loss='sparse_categorical_crossentropy',
              metrics=['accuracy'])

 

 

6.  모델 훈련

#model.fit 훈련 돌림 #Train의 정확도

신경망 모델을 훈련하는 단계는 다음과 같다:

  1. 훈련 데이터를 모델에 주입한다. (이 예에서는 train_images와 train_labels 배열)
  2. 모델이 이미지와 레이블을 매핑하는 방법을 배운다.
  3. 테스트 세트에 대한 모델의 예측을 만든다. (이 예에서는 test_images 배열. 이 예측이 test_labels 배열의 레이블과 맞는지 확인)

훈련을 시작하기 위해 model.fit 메서드를 호출하면 모델이 훈련 데이터를 학습한다:

 

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

 

모델 훈련 결과

 

Epoch 횟수가 늘어나면 늘어날 수록 loss는 줄어들고 accuracy는 올라가는 것을 알 수 있다.

마지막 5번째 결과는 Loss 0.2396, Accuracy 0.9110 로 완료가 되었다.

여러번의 반복을 거쳐 이 모델로 약 91%의 정확도까지 끌어올렸다..!

 

 

7.  정확도 평가

#model.evaluate  #Test의 정확도

그다음 테스트 세트에서 모델의 성능을 비교한다.

60000개의 데이터로 모델을 훈련시켰고 이제 훈련 시킨 모델의 성능을 확인 하기 위해 10000개의 데이터로 테스트를 해본다:

 

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

print('\n테스트 정확도:', test_acc)

 

정확도 결과

 

흠.. 훈련에서는 정확도가 91% 였는데, 테스트에서는 이보다 2%나 높은 89%가 나왔다.

테스트 세트의 정확도가 훈련 세트의 정확도보다 조금 낮다. 훈련 세트의 정확도와 테스트 세트의 정확도 사이의 차이는 과대적합(overfitting) 때문이다. 과대적합은 머신러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 현상을 말한다.

Overfitting에 대한 오차를 줄이는 방법도 학계에서 계속 고안중이다.

 

 

 

8.  예측 만들기

그럼 테스트 이미지를 하나씩 불러와 훈련된 모델에 적용해보자.

 

# 결과 이미지를 보기 좋게 하기 위한 plot 설정
def plot_image(i, predictions_array, true_label, img):
  predictions_array, true_label, img = predictions_array[i], true_label[i], img[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])

  plt.imshow(img, cmap=plt.cm.binary)

  predicted_label = np.argmax(predictions_array)
  if predicted_label == true_label:
    color = 'blue'
  else:
    color = 'red'

  plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label],
                                100*np.max(predictions_array),
                                class_names[true_label]),
                                color=color)

def plot_value_array(i, predictions_array, true_label):
  predictions_array, true_label = predictions_array[i], true_label[i]
  plt.grid(False)
  plt.xticks([])
  plt.yticks([])
  thisplot = plt.bar(range(10), predictions_array, color="#777777")
  plt.ylim([0, 1])
  predicted_label = np.argmax(predictions_array)
  
  # 예측 결과는 빨간색, 실제 정답은 파란색
  thisplot[predicted_label].set_color('red')
  thisplot[true_label].set_color('blue')

#10번째 테스트 이미지 사용. 결과 출력.
i = 10
plt.figure(figsize=(6,3))
plt.subplot(1,2,1)
plot_image(i, predictions, test_labels, test_images)
plt.subplot(1,2,2)
plot_value_array(i, predictions,  test_labels)
plt.show()

 

10번째 테스트 이미지 결과.

91%의 정확도로 정답.

 

 

12번째 테스트 이미지 결과.

75%의 오답률로 sneaker인데 sandal로 오답.


https://www.tensorflow.org/tutorials/keras/classification?hl=ko 

 

첫 번째 신경망 훈련하기: 기초적인 분류 문제  |  TensorFlow Core

Note: 이 문서는 텐서플로 커뮤니티에서 번역했습니다. 커뮤니티 번역 활동의 특성상 정확한 번역과 최신 내용을 반영하기 위해 노력함에도 불구하고 공식 영문 문서의 내용과 일치하지 않을 수

www.tensorflow.org

 

 

 

위 글이 도움이 되셨나면, 아래 하트를 눌러주세요↓

감사합니다 \( ˆoˆ )/​

반응형

댓글