Tensorflow - Fashion MNIST

Fashion MNIST

  • MNIST
    • 손으로 쓴 숫자들로 이루어진 대형 데이터베이스
    • 다양한 화상 처리 시스템을 트레이닝하기 위해 일반적으로 사용되는 데이터베이스

< MNIST >

 

  • Fashion MNIST
    • MNIST가 무엇인지 이해하면 이제 Fashion MNIST도 이해가 쉬울 것이다.
    • 즉, 의류에 대한 데이터베이스를 인공지능이 학습하여 의류를 구분 할 수 있게 하는 라이브러리

< Fashion MNIST >


예시에 사용 될 데이터프레임

  • fashion_mnist 데이터 : tf.keras datasets API에 포함(자체적 제공)
  • 10개로 분류된 의류 이미지를 분류하는 인공지능 모델 만들기

 

데이터프레임 호출

  • 데이터셋은 텐서플로우 라이브러리 자체에 포함
    • tf.keras.datasets으로 호출
  • 학습/검증을 위한 이미지와 레이블 각각 2개씩 총 4개의 데이터셋을 반환
    • 튜플로 2개씩 짝지어 반환하며 첫번째에는 이미지, 두번째에는 이미지가 구분된 값을 저장
    • 4개의 변수 이름은 임의로 지정
      • 이해하기 쉽게 풀어쓰자면 X_train, X_test, y_train, y_test
# 텐서플로 라이브러리 호출
import tensorflow as tf

# 데이터프레임 자체가 텐서플로 라이브러리에 포함
mnist = tf.keras.datasets.fashion_mnist

# 데이터프레임 호출 -> 트레이닝과 테스트셋 호출
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

 

데이터셋의 구조 이해하기

training_images.shape
>>> (60000, 28, 28)
  • (60000, 28, 28)
    • 60000 : 이미지의 순서 (첫번째 이미지)
    • 28, 28 : 가로 28행, 세로 28열

 

데이터 구조 이해하기

training_images[0]
>>>
array([[  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0],         
		...

       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
          0,   0]], dtype=uint8)
  • images[0] : 인덱스, 데이터셋 구조의 첫번째(60000에 해당하는 부분), 즉 첫번째 이미지를 의미
  • 출력 되는 값 : 각 픽셀의 RGB값(0~255), 28x28의 크기를 가지는 행렬

피쳐 스케일링 - 정규화

  • 각 이미지들의 RGB(0~255)값을 피쳐 스케일링 진행
  • 스케일러를 호출하지 않아도 255로 나누면 피쳐 스케일링 가능 (0~1의 값으로 변환)
# 0~ 255의 값이므로 피쳐스케일링을 따로 진행하지 않아도 된다.
training_images = training_images / 255.0
test_images = test_images / 255.0

인공지능 모델링

인공지능 딥러닝 모델링

model = tf.keras.models.Sequential()

 

이미지 Flatten 작업

  • Flatten : 다차원의 행렬을 1차원의 행렬로 변환하는 작업, 하나의 1차원의 행렬로 이어서 붙임
  • Flatten을 사용하면 input_shape를 지정하지 않아도 자동으로 지정
model.add(tf.keras.layers.Flatten())

 

계층(Layer) 생성

# Dense
model.add(tf.keras.layers.Dense(128, 'relu'))

 

활성함수 softmax를 이용하여 분류

model.add(tf.keras.layers.Dense(10, 'softmax'))
  • 3개 이상의 분류 문제를 다룰 때 쓰는 활성 함수
  • 데이터를 0~1사이의 값으로 정규화하여 출력되는 값들의 총 합은 1이 되는 함수
    • 여러개의 값 중에서 가장 큰 값을 1을 만들고 나머지의 값들을 0으로 만듦

 

분류 문제의 모델 컴파일

  • 현 예시의 분류에서는 의류에 대한 분류 이므로 3개이상
    • y의 값이 1, 2, 3 등등 으로 나열되어 있으므로 레이블 인코딩
      • sparse_categorical_crossentropy 사용
model.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])

 

+ 분류 문제의 활성함수와 손실함수

https://luvris2.tistory.com/163

 

tensorflow - 분류 문제에서 활성 함수와 손실 함수 설정

분류 문제에서의 활성함수 (Activation Function) Sigmoid 2개의 분류 문제를 다룰 때 쓰는 활성 함수 알려지지 않는 파라미터를 데이터로부터 추정해 0과 1로 분류하는 것 Softmax 3개 이상의 분류 문제를

luvris2.tistory.com

 

인공지능 모델 학습

model.fit(training_images, training_labels, epochs=5)

 

성능 평가

model.evaluate(test_images, test_labels)
>>> 313/313 [==============================] - 1s 2ms/step - loss: 0.3652 - accuracy: 0.8708
[0.3651878535747528, 0.8708000183105469]
  • 정확도 87퍼센트

예측된 값의 실제값 확인

  • 인공지능 예측
# 예측하고 첫번째 이미지 확인
y_pred = model.predict(test_images)
plt.imshow( test_images[0], cmap='gray')

 

  • 예측값의 실제값 확인
y_pred[0].argmax()
>>> 9

 

  • 실제 데이터와 일치하는지 확인
test_labels[0]
>>> 9

 

  • + 소프트맥스의 함수 특성 확인하기 (모든 합이 1이 되는 함수)
# 레이블 인코딩된 소프트맥스 활성함수 이용 출력 값 
y_pred[0]
>>> array([7.8119228e-06, 8.7083414e-08, 6.8455364e-08, 1.5924198e-07,
       2.8541135e-07, 3.0820727e-04, 3.5284240e-06, 1.9661729e-01,
       4.1257539e-05, 8.0302131e-01], dtype=float32)
       
# 가장 높은 값의 값
y_pred[0].max()
>>> 0.8030213

# 모든 값의 합 확인, 소프트맥스 함수의 특성 충족
y_pred[0].sum()
>>> 1.0

결과 지표 확인하기

  • 예측값(y_pred)이 레이블 인코딩 된 값이므로 실제값만 남기기
# 실제값의 열만 변수에 재저장
y_pred = y_pred.argmax(axis=1)

 

  • 결과지표 보기
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(test_labels, y_pred)
cm
>>>
array([[880,   1,   9,  16,   1,   2,  89,   0,   2,   0],
       [  7, 966,   0,  22,   2,   0,   3,   0,   0,   0],
       [ 25,   0, 742,  19, 121,   0,  92,   0,   1,   0],
       [ 29,   5,   6, 900,  17,   0,  40,   0,   3,   0],
       [  1,   1,  85,  53, 767,   0,  89,   0,   4,   0],
       [  0,   0,   0,   1,   0, 912,   0,  74,   1,  12],
       [174,   0,  66,  25,  59,   0, 668,   0,   8,   0],
       [  0,   0,   0,   0,   0,   5,   0, 986,   1,   8],
       [ 13,   0,   3,   5,   3,   1,   7,   4, 964,   0],
       [  0,   0,   0,   1,   0,   4,   1,  91,   0, 903]])

 

  • 결과지표 히트맵으로 보기
import seaborn as sns
sns.heatmap(cm, annot=True,fmt='.0f', cmap='RdPu')
plt.show()


Fashion-MNIST 모델링시 주의사항

  • 화상 처리의 분류 모델에서는 Flatten 라이브러리를 쓰지 않으면 에러 출력, 반드시 사용
  • 출력층이 학습할 컬럼수보다 적으면 학습을 시행하지 않음 (loss:nan, accuracy:0.100 출력)
  • epochs가 많을수록 과대적합 현상 발생
    • 과대적합(Overfitting) : 너무 많은 학습으로 학습한 결과가 학습에 사용된 데이터와 거의 일치하여 새로운 데이터가 들어 왔을 때 예측이 틀려버리는 상태