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
'Lecture AI > 1장.딥러닝이란 무엇인가?' 카테고리의 다른 글
1. 딥러닝이란 무엇인가? 작동 원리에 대한 이해 (0) | 2021.07.27 |
---|