Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

파이썬과 TensorFlow로 Fashion MNIST 데이터셋 모델 학습시키는 방법

개요

TensorFlow(텐서플로우)는 구글이 제공하는 머신러닝 프레임워크입니다. 오픈소스 기반으로 Python과 함께 사용되어 다양한 알고리즘, 딥러닝 애플리케이션 등을 구현할 수 있으며, 연구 목적과 상용 환경 모두에서 널리 활용됩니다.

Windows 환경에서는 아래 명령어 한 줄로 'tensorflow' 패키지를 설치할 수 있습니다.

pip install tensorflow

텐서(Tensor)는 TensorFlow에서 사용하는 핵심 데이터 구조입니다. 데이터 흐름 그래프(Data Flow Graph)의 간(edge)을 연결하는 역할을 하며, 본질적으로 다차원 배열 또는 리스트라고 할 수 있습니다.

Fashion MNIST 데이터셋이란?

'Fashion MNIST' 데이터셋은 다양한 종류의 의류 이미지를 담고 있는 데이터셋입니다. 10개 서로 다른 카테고리에 속하는 7만 장 이상의 회색조(grayscale) 의류 이미지로 구성되어 있으며, 해상도는 28 x 28 픽셀로 낮은 편입니다.

이 글의 코드는 구글 코랩(Google Colaboratory)에서 실행했습니다. Colab은 브라우저에서 바로 파이썬 코드를 실행할 수 있게 해주며, 별도의 설정 없이 GPU에 무료로 접근할 수 있다는 장점이 있습니다. Colaboratory는 Jupyter Notebook을 기반으로 만들어졌습니다.

예제 코드

아래 코드는 준비된 모델을 학습 데이터에 맞춰 훈련한 뒤, 테스트 데이터로 정확도를 평가하는 과정을 보여줍니다.

print("모델을 학습 데이터에 피팅합니다")
model.fit(train_images, train_labels, epochs=15)

print("정확도를 계산합니다")
test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2)
print('\n테스트 정확도 :', test_acc)

코드 출처 - https://www.tensorflow.org/tutorials/keras/classification

실행 결과

모델을 학습 데이터에 피팅합니다
Epoch 1/15
1875/1875 [==============================] - 4s 2ms/step - loss: 0.6337 - accuracy: 0.7799
Epoch 2/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.3806 - accuracy: 0.8622
Epoch 3/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.3469 - accuracy: 0.8738
Epoch 4/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.3131 - accuracy: 0.8853
Epoch 5/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2962 - accuracy: 0.8918
Epoch 6/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2875 - accuracy: 0.8935
Epoch 7/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2705 - accuracy: 0.8998
Epoch 8/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2569 - accuracy: 0.9023
Epoch 9/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2465 - accuracy: 0.9060
Epoch 10/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2440 - accuracy: 0.9088
Epoch 11/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2300 - accuracy: 0.9143
Epoch 12/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2255 - accuracy: 0.9152
Epoch 13/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2114 - accuracy: 0.9203
Epoch 14/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2101 - accuracy: 0.9211
Epoch 15/15
1875/1875 [==============================] - 3s 2ms/step - loss: 0.2057 - accuracy: 0.9224
정확도를 계산합니다
313/313 - 0s - loss: 0.3528 - accuracy: 0.8806

테스트 정확도 : 0.8805999755859375

코드 설명

  • 먼저 학습 데이터를 모델에 입력하여 학습을 진행합니다. 'train_images'와 'train_labels'는 입력 데이터가 담긴 배열입니다.

  • 학습 과정에서 모델은 이미지와 해당 라벨(label) 사이의 매핑 관계를 익히게 됩니다.

  • 'test_images'에는 테스트용 데이터가 저장되어 있습니다.

  • 테스트 데이터셋으로 예측을 수행하면, 그 결과가 실제 라벨과 비교되어 성능이 평가됩니다.

  • 'model.fit' 메서드를 호출하면 모델이 학습 데이터셋에 맞춰 훈련됩니다.

  • 'model.evaluate' 함수는 학습 과정에서 얻어진 정확도와 손실(loss) 값을 반환합니다.

결과 분석

실행 결과를 보면 15번의 에포크(epoch) 동안 손실은 0.6337에서 0.2057까지 꾸준히 감소했고, 학습 정확도는 77.99%에서 92.24%까지 상승했습니다. 최종적으로 테스트 데이터셋에서 측정된 정확도는 약 88.06%로, 학습 정확도와 다소 차이가 있는데 이는 모델이 학습 데이터에 다소 과적합(overfitting)되었음을 시사합니다. 드롭아웃(Dropout), 조기 종료(Early Stopping) 같은 기법을 적용하면 일반화 성능을 더욱 개선할 수 있습니다.