[딥러닝 입문] 딥러닝의 Hello World: MNIST 데이터 다루기(2)

박성수·2022년 10월 7일
0

본 노트는 개인적인 공부 정리를 위한 블로그 글입니다


5. Optimizer: rmasprop

모델이 정의됐다면, 정의한 모델에 대해 손실함수와 최적화 모델을 지정해야 한다. 지정하는 방법은 compile() 메서드를 사용하며, 아래 에제에서는 Optimizer로 rmasprop을 사용한다.
Optimizer는 딥러닝 네트워크 간 빠르고 정확한 학습을 촉진하기 위한 매개이다. 딥러닝의 역사만큼 Optimzer 또한 개선되어 왔으며, 현재 주로 사용되는 모델로는 AdamRMSProp 등이 있다.

network.compile(optimizer='rmsprop',
                loss='categorical_crossentropy',
                metrics=['accuracy'])

6. loss 함수: categroical_crossentropy

손실 함수는 훈련 데이터에서 신경망의 성능을 측정하는 방법으로, 네트워크가 옳은 방향으로 학습될 수 있도록 도와준다. 모델을 통해 예측되는 예측값과 실제값이 얼마나 유사한지 판단하는 기준이 된다.

다음과 같은 기준으로 손실함수를 선택하면 된다.

MNIST예제는 Category에 해당하는 클래스 분류 문제이므로, Categorical CrossEntropy 함수를 선택한다.


7. metric: accuracy

metric은 원하는 지표로 모델 성능을 측정하고 싶을 때 사용된다. Loss함수로 학습이 이루어지는데 굳이 다른 성능 지표가 필요할까 싶을 수도 있지만, 미분이 불가능한 성능 지표이거나 (accuracy), loss함수가 여러 개의 성능지표의 합일 경우 등 metrics를 필요로 하는 경우가 있다.


8. 데이터 전처리 과정

최적화 모델에 대한 설정까지 끝났다면,

훈련을 시작하기 전에 데이터를 네트워크에 맞는 크기로 바꾸고 모든 값을 0과 1 사이로 스케일을 조정한다. 예를 들어, 앞서 우리의 훈련 이미지는 [0, 255] 사이의 값인 uint8 타입의 (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

또한, 레이블을 범주형으로 인코딩한다.

# from keras.utils import to_categorical
from tensorflow.keras.utils import to_categorical

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

9. 실습코드 및 주석

keras는 fit() 메서드를 이용해 훈련 데이터에 모델을 학습시킨다.
epochs는 전체 데이터 셋에 대해 몇번의 학습 과정을 걸칠지에 대한 설정 값이다.
batch size는 한 번의 batch마다 주는 데이터 샘플의 size를 나타낸다.

훈련에 대한 결과로는 네트워크의 손실과 정확도가 출력된다.

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

> Epoch 1/5
469/469 [==============================] - 4s 3ms/step - loss: 0.2531 - accuracy: 0.9262
Epoch 2/5
469/469 [==============================] - 1s 3ms/step - loss: 0.1022 - accuracy: 0.9701
Epoch 3/5
469/469 [==============================] - 1s 3ms/step - loss: 0.0681 - accuracy: 0.9791
Epoch 4/5
469/469 [==============================] - 1s 3ms/step - loss: 0.0494 - accuracy: 0.9850
Epoch 5/5
469/469 [==============================] - 1s 3ms/step - loss: 0.0368 - accuracy: 0.9888
<keras.callbacks.History at 0x7f724c396990>

훈련 데이터에 대해 0.989(98.9%)의 정확도 달성한 것을 확인했다. 이제 훈련된 모델을 test Data Set에 적용하여 손실과 정확도를 측정해보자.

test_loss, test_acc = network.evaluate(test_images, test_labels)
> 313/313 [==============================] - 1s 2ms/step - loss: 0.0694 - accuracy: 0.9782
profile
개발자를 꿈꾸는

0개의 댓글