본문 바로가기

Deep Learning

[Deep Learning]딥러닝 ANN으로 이미지API(텐서플로우) 활용하여 이미지 분류하기

ANN(Artificial_Neural_Network)으로 텐서플로우 패션이미지API 를 활용해서 이미지를 분류하는 인공지능을 만들어보려고 한다.

 

import numpy as np
import tensorflow as tf
from tensorflow.keras.datasets import fashion_mnist

1.필요한 프로젝트 import 해주기

먼저 넘파이, 텐서플로우, 그리고 텐서플로우의 케라스 모듈에서

fashion_mnist 데이터셋을 가져와서 사용할 수 있도록 준비

2. 데이터셋 로딩하기(학습 및 테스트)

 fashion_mnist.load_data()

 fashion_mnist.load_data()함수는 이미 훈련 및 테스트 데이터를 나누어 반환한다. 이 데이터는 훈련 이미지와 레이블, 그리고 테스트 이미지와 레이블로 구성되어 있다. 이것을 사용하여 모델을 훈련하고 테스트할 수 있다.

shape 에서(60000,28,28)은 28행 28열이 6만개가 있다는 뜻이다.

 

3. 이미지 정규화하기

X_train = X_train / 255
X_test = X_test / 255

이미지 정규화 하려면 원래는 피쳐 스케일링을 하는게 맞지만,이미지는 RGB 값 즉 0~255 사이의 숫자로 밖에 표현이 안되어 있기 때문에 255로 나누어주기만 하면 0~1 사이의 값으로 정규화가 된다

 

4. 신경망 모델 정의하기

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Flatten
def build_model():
  model = Sequential()
  model.add(Flatten())
  model.add( Dense(128, 'relu'))
  model.add( Dense( 10, 'softmax'))
  model.compile('adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
  return model

model.add(Flatten()) :입력 이미지를 1차원 배열로 펼치는 Flatten 레이어 추가

model.add(Dense(128, activation='relu')):   첫번째 밀집층(Dense layer) 추가,은닉층에 128개의 뉴런을 설정하고, 'relu' 활성화 함수 사용

model.add(Dense(10, activation='softmax')):'softmax'는 각 클래스에 대한 확률을 출력하기 위해 사용됨

 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']):

 'adam' 옵티마이저 사용
 'sparse_categorical_crossentropy' 손실 함수 사용 (다중 분류 문제에 적합)
 평가 지표로는 'accuracy'를 사용하여 정확도를 측정

 

5. 모델 학습하기

  • monitor='val_loss': 모니터링할 지표를 지정.여기서는 검증 데이터셋에 대한 손실을 모니터링.
  • patience=10: 훈련 과정에서 검증 손실이 개선되지 않을 때 얼마나 기다릴지를 지정. 예를 들어, 검증 손실이 10번의 연속된 에포크 동안 개선되지 않으면 훈련이 중지.
  • epochs=1000: 최대 훈련 에포크 수를 지정. 조기 종료가 활성화되어 있더라도 이 값보다 적은 횟수의 에포크로 훈련이 중지될 수 있음
  • validation_split=0.2: 훈련 데이터의 일부를 검증 데이터로 사용할 비율을 지정. 이 비율만큼의 데이터는 모델이 훈련하는 동안 사용되지 않고, 검증 과정에서 모델의 성능을 평가하는 데 사용.
  • callbacks=[early_stop]: 훈련 중에 사용할 콜백 함수 목록을 지정. 여기서는 조기 종료를 위한 EarlyStopping 콜백을 사용.

이렇게 설정하면 훈련 도중에 검증 손실이 더 이상 개선되지 않을 때 자동으로 훈련이 조기 종료

 

6.모델 평가 및 예측하기

먼저 평가이다

먼저 X_test,y_test 를 평가 했을 때, loss(오차율)은 0.3539 accuracy(정확도)는 0.8829 가 나왔다

 

그 다음 예측을 해볼 것인데 먼저,예측 해볼 이미지를 넘파이와 이미지로 가져와본다.

  • X_test[0, :, :]: 테스트 데이터셋 중 첫 번째 이미지를 선택. 첫 번째 차원은 이미지 인덱스를 나타내며, 두 번째와 세 번째 차원은 이미지의 픽셀을 나타낸다. 따라서 X_test[0, :, :]는 첫 번째 이미지의 모든 행과 열을 선택한다.

plt.imshow():  X_test[0, :, :] 를 이미지로 불러왔을 때의 모습이며 cmap은 gray를 하면 회색의 픽셀로 가져온다.

y_pred= model.predict(X_test[ 0 , : , :  ].reshape(1,28,28))

 

reshape를 해줌으로써 2차원 배열을 3차원으로 바꿔준다. 그 이유는 데이터를 받았을 때에도 3차원으로 받았기 때문에 예
측 데이터 또한 3차원으로 받아줘야한다.
y_test[0] 의 결과는 9가 나왔는데,Ankle boots로 잘 나왔는지 확인해 볼 필요가 있다

확인해 봤을 때 9로 서로 같으므로 잘 예측해준 것을 볼 수 있다.

 

7.Confusion Matrix 확인해보기

y_pred와 y_test의 Confusion Matrix 를 확인하려했지만 서로 비교하기 어려운 상태이다

y_pred.argmax(axis = 1)을 해주면 된다.

예측 확률 분포에서 가장 큰 값을 가진 클래스의 인덱스를 반환한다.

이렇게 함으로써 모델이 예측한 클래스를 실제 클래스 레이블과 비교하여 모델의 예측 정확도를 평가한다.

정확도를 확인했을 때 88% 정도가 나오는 것을 볼 수 있다.