데이터 과학

패션 MNIST 소스 분석 본문

인공지능/딥러닝 -파이썬 인공지능

패션 MNIST 소스 분석

티에스윤 2025. 9. 10. 19:08

패션 MNIST 사이트에서 소스를 분석을 해서 CNN 이전에 MLP로 알고리즘을 구현하여 Flattern-> Dense 형식으로 학습을 활용하는 예제를 알아봅시다. 

 

https://www.tensorflow.org/tutorials/keras/classification?hl=ko

 

기본 분류: 의류 이미지 분류  |  TensorFlow Core

기본 분류: 의류 이미지 분류 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 튜토리얼에서는 운동화나 셔츠 같은 옷 이미지를 분류하는 신경망 모델을

www.tensorflow.org

 

1) 데이터 & 전처리

  • 데이터셋: Fashion-MNIST (28×28 흑백, 10클래스, Train 60k / Test 10k). 이 튜토리얼은 MNIST의 대체재로 조금 더 어려운 데이터라 소개합니다. 
  • 로드 코드:
    fashion_mnist = tf.keras.datasets.fashion_mnist → load_data()로 (train_images, train_labels), (test_images, test_labels) 반환.
  • 스케일링: train_images = train_images / 255.0 (test도 동일). 픽셀을 [0,1] 범위로 정규화합니다.
  • 클래스 이름: ['T-shirt/top','Trouser','Pullover','Dress','Coat','Sandal','Shirt','Sneaker','Bag','Ankle boot']. 

메모: 본 튜토리얼은 검증 세트 분리 없이 train으로만 학습하고, 최종 성능은 test에서 평가합니다(간단 데모 목적).

 

2) 모델 아키텍처(MLP, from_logits=True)

위 튜토리얼 모델은 합성곱이 없는 기본 신경망입니다.

 
Input(28×28) → Flatten(784) → Dense(128, ReLU) → Dense(10) # logits (Softmax는 붙이지 않음; from_logits=True로 컴파일)

정의 코드: Sequential([Flatten, Dense(128,'relu'), Dense(10)])

파라미터 수(정확 계산)

  • Flatten: 가중치 없음.
  • Dense(784→128): 784×128 + 128(bias) = 100,480
  • Dense(128→10): 128×10 + 10 = 1,290
  • 총계: 101,770 파라미터.

컴파일 설정

  • optimizer='adam'
  • loss=SparseCategoricalCrossentropy(from_logits=True)
  • metrics=['accuracy']
    → 코드 그대로이며, 마지막 층은 Softmax 없이 logits를 내고, 손실에서 from_logits=True로 처리합니다.

3) 학습 설정

  • 훈련 호출: model.fit(train_images, train_labels, epochs=10) (배치 크기는 Keras 기본값).
  • 지표 출력: 에포크마다 loss/accuracy가 찍히는 기본 로그. 예시 로그가 튜토리얼에 포함돼 있습니다.

4) 결과(튜토리얼 기준) & 해석

  • Train 정확도: 대략 ~0.90 근처(로그 예시 기준 0.9097).
  • Test 정확도: 예시 출력 0.8799. 튜토리얼은 Test가 Train보다 낮은 이유를 과대적합으로 간단히 설명합니다.

왜 이런 성능인가?

  • Fashion-MNIST는 MNIST보다 난도가 높고(클래스 간 시각적 유사성),
  • 합성곱 없이 전역 픽셀을 일렬로 펼친 MLP는 지역 패턴(에지/텍스처)을 학습하기에 불리합니다.
  • 따라서 베이스라인으론 괜찮지만, CNN으로 바꾸면 일반적으로 더 높은 정확도를 얻을 수 있습니다(아래 §7 참조).

 

5) 예측 단계(확률화 및 시각화)

  • 확률 변환: 학습된 model(logits)에 Softmax()를 덧붙인 probability_model로 예측 확률을 구합니다.
    probability_model = tf.keras.Sequential([model, tf.keras.layers.Softmax()])
    predictions = probability_model.predict(test_images) 
  • 해설용 시각화 코드: 단일 이미지/여러 이미지에 대해 예측 막대 그래프정답·예측 라벨을 함께 그리는 plot_image, plot_value_array 함수를 제공합니다. 튜토리얼에 동일 코드가 포함되어 있습니다.

 

6) 오류/혼동이 생기는 이유(정성)

  • 카테고리 유사성: Pullover/Coat/Shirt, Sandal/Sneaker 등 텍스처·실루엣이 겹치는 샘플에서 혼동이 발생하기 쉽습니다.
  • MLP 한계: 지역 구조를 직접적으로 포착하지 못해, 밝기/배경 변화에 덜 강건합니다.
  • 데이터 증강 부재: 기본 예제는 증강 없이 정규화만 수행합니다.

 

7) 간단 개선안(튜토리얼 유지 vs CNN 전환)

(A) 튜토리얼 틀 유지(MLP)에서의 소폭 개선

  • Dropout(0.2~0.5)를 Dense 사이에 추가 → 과적합 완화
  • label_smoothing=0.05로 CE에 라벨 스무딩 적용
  • ReduceLROnPlateau/EarlyStopping 콜백 추가
  • 입력을 (28,28,1)로 바꾸고 Conv 레이어 없이라도 BatchNormalization 추가로 수렴 안정화

 

(B) CNN 전환(권장)

  • 구조 예:
    Conv2D(32,3,'same')→MaxPool2D → Conv2D(64,3,'same')→MaxPool2D → Flatten → Dropout(0.25) → Dense(128) → Dense(10 logits)
  • 기대 효과: 지역 패턴을 직접 학습해 Fashion-MNIST에서도 ~90%대 초·중반 이상으로 올라가는 경우가 일반적(학습 스킴/증강에 따라 상회 가능).

8) 재현 체크리스트

  • 전처리: 꼭 x/255.0 동일 적용(Train/Test 모두) 
  • 모델 정의: Flatten→Dense(128 ReLU)→Dense(10) 정확히 일치 확인 
  • 컴파일: SparseCategoricalCrossentropy(from_logits=True) 유지(출력층에 Softmax가 없기 때문)
  • 평가: model.evaluate(test_images, test_labels)로 최종 정확도 확인 
  • 확률/시각화: 튜토리얼의 probability_model 및 plotting 함수 사용 

 

간단 MLP로 Fashion-MNIST를 분류하는 입문 예제입니다. 정확도는 ~0.88–0.90 수준으로 제시되며, from_logits=True 구성과 확률 변환용 Softmax 래퍼가 핵심 포인트입니다.