본문 바로가기

Lecture AI/1장.딥러닝이란 무엇인가?

2. 첫번째 신경망 실습 :mnist 실습

반응형

Note: 클래스와 레이블에 관한 노트

머신 러닝에서 분류 문제의 범주(category)를 클래스(class)라고 합니다. 데이터 포인트는 샘플(sample)이라고 합니다. 특정 샘플의 클래스는 레이블(label)이라고 합니다.


 

MNIST 데이터셋을 이용한 첫 번째 실습을 해보겠습니다.

 

코드 보기

 

from keras.datasets import mnist
(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

train_x 가 모델이 학습해야 할 훈련 세트(training set)를 구성합니다. 모델은 test_x로 구성된 테스트 세트(test set)에서 테스트될 것입니다.  이미지는 넘파이 배열로 인코딩 되어 있고 레이블은 0부터 9까지의 숫자 배열입니다.

 

train_images.shape
len(train_labels)
train_labels

test_images.shape
len(test_labels)
test_labels

 

아래 명령어를 보면 신경망의 핵심 구성 요소는 일종의 데이터 처리 필터라고 생각할 수 있는 층(layer)입니다. 어떤 데이터가 들어가면 더 유용한 형태로 출력됩니다.  아래 예제에서는 조밀하게 연결된(완전 연결) 신경망 층인 Dense층 2개가 연속되어 있습니다. 두 번째(즉 마지막) 층은 10개의 확률 점수가 들어 있는 배열을 반환하는 소프트맥스층입니다.

from keras import models
from keras import layers

network = models.Sequential()
network.add(layers.Dense(512, activation='relu', input_shape=(28 * 28,)))
network.add(layers.Dense(10, activation='softmax'))

 

 

신경망이 훈련 준비를 마치기 위해서 컴파일 단계에 포함된 세 가지 더 필요합니다.

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])
  • 손실 함수(loss function): 훈련 데이터에서 신경망의 성능을 측정하는 방법으로 네트워크가 옳은 방향으로 학습될 수 있도록
  • 옵티마이저(Optimizer): 입력된 데이터와 손실 함수를 기반으로 네트워크를 업데이트하는 메커니즘
  • 훈련과 테스트 과정을 모니터링할 지표: 여기에서는 정확도

 

 

훈련을 시작하기 전에 데이터를 네트워크에 맞는 크기로 바꾸고 모든 값을 0과 1사이로 스케일을 조정합니다. 예를 들어 앞서 우리의 훈련 이미지는 [0,255] 사이의 값인 unit8 타입의 (60000, 28, 28) 크기를 가진 배열로 저장되어 있습니다. 이 데이터를 0과 1 사이의 값을 가지는 float32 타입의 (60000, 28*28) 크기인 배열로 바꿉니다.

train_images = train_images.reshape((60000, 28 * 28))
train_images = train_images.astype('float32') / 255

test_images = test_images.reshape((10000, 28 * 28))
test_images = test_images.astype('float32') / 255

 

레이블을 범주형으로 인코딩해야 합니다. 이 단계는 3장에서 자세히 설명합니다.

import tensorflow as tf
from tensorflow.keras.utils import to_categorical

train_labels = to_categorical(train_labels)
test_labels = to_categorical(test_labels)

 

network.fit(train_images, train_labels, epochs=5, batch_size=128)

훈련하는 동안 2개의 정보가 출력됩니다. 훈련 데이터에 대한 네트워크의 손실과 정확도입니다.

Epoch 1/5
469/469 [==============================] - 19s 9ms/step - loss: 0.4389 - accuracy: 0.8727
Epoch 2/5
469/469 [==============================] - 5s 10ms/step - loss: 0.1128 - accuracy: 0.9678
Epoch 3/5
469/469 [==============================] - 5s 11ms/step - loss: 0.0701 - accuracy: 0.9799
Epoch 4/5
469/469 [==============================] - 5s 10ms/step - loss: 0.0471 - accuracy: 0.9861
Epoch 5/5
469/469 [==============================] - 6s 12ms/step - loss: 0.0352 - accuracy: 0.9896

 

테스트 세트의 정확도는 97.8%로 나왔습니다. 훈련 세트 정확도보다는 약간 낮습니다. 훈련 정확도와 테스트 정확도 사이의 차이는 과대적합(overfitting)때문입니다. 이는 머신 러닝 모델이 훈련 데이터보다 새로운 데이터에서 성능이 낮아지는 경향을 말합니다. 

test_loss, test_acc = network.evaluate(test_images, test_labels)
print('test_acc:', test_acc)

결과는 아래와 같습니다.

313/313 [==============================] - 1s 2ms/step - loss: 0.0713 - accuracy: 0.9774
test_acc: 0.977400004863739
반응형