개발/머신러닝

파이썬 머신러닝 - 이미지 학습을 위한 flatten, 3개 이상 분류 액티베이션함수 softmax 와 loss 셋팅방법.

웅'jk 2022. 12. 28. 18:09

파이썬에서 이미지를 학습하기 위해서 먼저 이미지의 구조를 알아야 합니다.

 

파이썬에서 이미지는 가로 x 세로의 좌표값에 색상코드를 가지고 있게 됩니다. (0~ 255)

즉 이미지는 기본적으로 2차원 데이터라는 소리입니다. 

 

그럼 이 이미지들의 데이터셋들(이미지가모여있으면)은 3차원 데이터가 됩니다.

 

가로 x 세로로 이미지가 표현되고 그 이미지들이 겹겹이 쌓여있어 높이를 형성했다 라고 생각하시면 됩니다.

 

텐서플로우에는 이러한 이미지를 가지고 테스트할 수 있도록 데이터가 들어있습니다.

import tensorflow as tf

# fashion_mnist 라는 라이브러리로 들어있습니다.
mnist=tf.keras.datasets.fashion_mnist

이 가져온 라이브러리에서 트레이닝과 테스트 셋을 가져옵니다.

(X_train, y_train),(X_test , y_test) = mnist.load_data()

그럼 X_train은 6만개 , X_test 는 1만개의 이미지 데이터가 저장되어 있습니다.

 

이를 pyplot 을 통해 나타내보면 

import matplotlib.pyplot as plt
plt.imshow(X_train[0] , cmap='gray')
plt.show()

첫번째 데이터를 찍으면 이미지가 표시 될 것입니다.

 

이제 이 데이터들을 이용하여 예측을 하는 모델을 해보겠습니다.

 

먼저 y축을 간략하게 설명하면 10가지 옷의 분류 입니다.

 

X 축은 이미지데이터입니다.

 

# x값을 스케일링 하는 방법은 이미 0~255 범위이기 때문에 /255.0 으로 해줍니다.
X_train = X_train / 255.0
X_test = X_test / 255.0

import tensorflow as tf
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense

from keras.layers import Flatten

# 모델생성
def build_model() :
  model = Sequential()
  model.add(Flatten() )
  model.add(Dense(units=128 , activation = 'relu'))
  model.add(Dense(units=64 , activation = 'relu'))
  model.add(Dense(units=10 , activation = 'softmax'))
  model.compile(optimizer='adam',loss = 'sparse_categorical_crossentropy',metrics=['accuracy'] )
  return model

여기서 그동안과는 다르게 loss가 sparse_categorical_crossentropy 로 되어있습니다.

 

그동안은 2개의 분류만을 이용했기 때문에 binary_crossentropy 를 사용했습니다만

 

3개 이상부터는 예측하고자 하는 데이터를 보고 판단을 하셔야 합니다.

y값이 레이블 인코딩으로 되어있으면, sparse_categorical_crossentropy
y값이 원 핫 인코딩으로 되어있으면, categorical_crossentropy
 
 
이런식으로 지금은 y의값이 레이블 인코딩 형식이기 때문에 sparse_categorical_crossentropy 를 사용합니다.
 
또한 activation 은 softmax 로 되어 있습니다. 이는 10개의 항목으로 뷴류 한다는 것은 확률을 구하는 문제입니다.
 
따라서 모든 값들의 합은 1이 되어야하며 가장 높은 값이 분류되기때문에 softmax를 사용합니다.