본 노트는 개인적인 공부 정리를 위한 블로그 글입니다
모델이 정의됐다면, 정의한 모델에 대해 손실함수와 최적화 모델을 지정해야 한다. 지정하는 방법은 compile()
메서드를 사용하며, 아래 에제에서는 Optimizer로 rmasprop을 사용한다.
Optimizer는 딥러닝 네트워크 간 빠르고 정확한 학습을 촉진하기 위한 매개이다. 딥러닝의 역사만큼 Optimzer 또한 개선되어 왔으며, 현재 주로 사용되는 모델로는 Adam
과 RMSProp
등이 있다.
network.compile(optimizer='rmsprop',
loss='categorical_crossentropy',
metrics=['accuracy'])
손실 함수는 훈련 데이터에서 신경망의 성능을 측정하는 방법으로, 네트워크가 옳은 방향으로 학습될 수 있도록 도와준다. 모델을 통해 예측되는 예측값과 실제값이 얼마나 유사한지 판단하는 기준이 된다.
다음과 같은 기준으로 손실함수를 선택하면 된다.
MNIST예제는 Category에 해당하는 클래스 분류 문제이므로, Categorical CrossEntropy
함수를 선택한다.
metric은 원하는 지표로 모델 성능을 측정하고 싶을 때 사용된다. Loss함수로 학습이 이루어지는데 굳이 다른 성능 지표가 필요할까 싶을 수도 있지만, 미분이 불가능한 성능 지표이거나 (accuracy), loss함수가 여러 개의 성능지표의 합일 경우 등 metrics를 필요로 하는 경우가 있다.
최적화 모델에 대한 설정까지 끝났다면,
훈련을 시작하기 전에 데이터를 네트워크에 맞는 크기로 바꾸고 모든 값을 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)
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