본문 바로가기
인공지능/Deep Learning

[Deep Learning] DNN TensorFlow 이미지 분류하는 딥러닝 해보기

by coding_su 2022. 12. 29.

📝딥러닝 DNN 텐서플로우 이미지를 분류하는 딥러닝 해보기

TensorFlow keras datasets API에 들어있는 Fashion MNIST데이터를 가져온다

mnist = tf.keras.datasets.fashion_mnist

 

트레이닝셋과 테스트셋을 가져온다

※ 텐서플로우에서 사진을 넘파이로 변환해둔 데이터

 X_train.shape의 결과 값은 (60000, 28, 28) = 28행 28열 6만장(갯수)이다

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

 

해당 데이터에 들어있는 두번째 사진의 이미지를 확인해보기 위해 pyplot의 imshow() 사용

plt.imshow(X_train[1], cmap='gray')
plt.show()

 

학습이 잘 되도록 0과 1사이의 값으로 노말라이징(normalizing)

※ 이미지의 최대값으로 나눈다

X_train = X_train / 255.0
X_test = X_test / 255.0

 

이미지의 가로 세로를 전부 일렬로 만드는 작업을 해주어(flatten) 모델을 만든다

from keras.models import Sequential
from keras.layers import Dense
from keras. layers import Flatten

def build_model() :
  model = Sequential()
  
  # 인풋레이어 Flatten() 사용
  model.add( Flatten() )
  model.add( Dense( units= 128, activation= 'relu') )
  model.add( Dense( units= 64, activation= 'relu') )
  model.add( Dense( units=10, activation= 'softmax' ) )

  # 로스펑션은 y값이 레이블 인코딩으로 되어있으므로 sparse_categorical_crossentropy 사용
  model.compile( optimizer= 'adam', loss= 'sparse_categorical_crossentropy', metrics= [ 'accuracy' ])
  return model

 

※ Flatten 라이브러리 없이 평탄화 하는 방법

# 아래 코드의 결과값은 (60000, 28, 28) 이다
X_train.shape

# 28 * 28 = 784이므로 열을 784로 변환해준다
X_train = X_train.reshape(60000, 784)

# X_test의 값도 변환해준다
X_test = X_test.reshape(10000, 784)

# 데이터 타입을 변경한 후 모델링할때 입력 input_shape=(784, )
def build_model() :
  model = Sequential()
  model.add( Dense( units= 128, activation= 'relu', input_shape=(784, ) ) )
  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

 

모델을 만들었으니 학습시킨다

model = build_model()

model.fit(X_train, y_train, epochs= 5)

 

나온 결과를 확인하고 학습에 사용하지 않은 테스트 데이터를 통해서 얼마의 정확도가 나오는지 확인한다

model.evaluate(X_test, y_test)

 

테스트 데이터를 예측시켜 변수에 저장한다

※ 예측한 결과는 리스트로 나온다 ANN의 아웃풋의 노드(뉴런)수가 10개 이기 때문에

 softmax 활성화 함수를 통해서 0~1사이의 10개의 숫자가 나오게 되어있다

y_pred = model.predict(X_test)

 

컨퓨전 매트릭스를 이용해서 어떤것을 컴퓨터가 많이 헷갈려 하는지 파악한다

※ numpy의 argmax() 함수를 이용하면 가장 큰 값이 들어있는 곳의 인덱스를 얻을 수 있다

from sklearn.metrics import confusion_matrix

# argmax() 함수를 이용해 레이블 인코딩
y_pred = y_pred.argmax(axis=1)

# 행이 실제값, 열이 예측값이다
confusion_matrix(y_test, y_pred)

 

그냥 보기엔 구분이 잘 가지 않으니 히트맵으로 확인한다

sb.heatmap(cm, annot= True, fmt='.0f', cmap='RdPu')
plt.show()

CNN으로 해보기 (https://coding-jisu.tistory.com/166)

댓글