딥러닝

Fashion mnist 10개로 분류된 패션 이미지를 tensorflow를 이용해 분류하는 딥 러닝

HooSL 2021. 12. 6. 17:58

1. 이미지와 행렬

모든 이미지 사진은 픽셀당 숫자로 되어있습니다.
0~255까지 되어있고 0이 검정색, 255가 흰색입니다.
그 숫자의 데이터 타입은 Uint8(Unsigned int) 이라고 적습니다.
먼저 검정부터 회색 , 흰색으로만 되어있는데 그걸 그레이 스케일이라고 합니다. (gray image)
컬러 이미지는 RGB 3개를 사용하고, colored Image 라고 합니다.
컬러 이미지를 그레이 스케일로 바꿔서 사용합니다. (컴퓨터가 특징을 잘잡기 때문)

2. 인공지능 학습에 필요한 데이터 가져오기

밑에서 할 코딩은 https://github.com/zalandoresearch/fashion-mnist#labels 를 사용합니다.

import tensorflow as tf
print(tf.__version__) #텐서플로우 버전 출력

Tensorflow를 사용하기 앞서 Tensorflow를 import 해야 합니다.

Tensorflow 코드를 편하게 사용하기 위해 as tf를 붙임으로써 tf로 사용합니다.

tf.__version__를 입력해 버전을 확인할 수 있습니다.

mnist=tf.keras.datasets.fashion_mnist #Fashion MNIST 데이터는 tf.keras datasets API에 들어있습니다
(X_train,y_train),(X_test,y_test)=mnist.load_data() # 트레이닝과 테스트셋을 가져옵니다.

트레이닝용 과 테스트용 이미지 사이즈와 개수를 확인합니다.

X_train.shape #트레이닝용 28 * 28 짜리 행렬이 이미지 한개가 60000장이다
X_test.shape #테스트용 28 * 28 짜리 행렬이 이미지 한개가 10000장이다

이미지를 한번 보겠습니다.

import matplotlib.pyplot as plt #matplotlib가 분석하기 편하게 컬러처럼 보이게 해주는 기능을 지원합니다.
plt.imshow(X_train[0]) #X_train의 첫번째 이미지 보기 gary scale로 보고 싶을땐 파라미터 cmap='gray'를 추가 하시면 됩니다.
plt.show()

 

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

우리가 기본적으로 하는 피쳐스케일링은 두가지를 가장 많이 사용합니다.
StandardScaler , MinMaxScaler (Standardzation , Nomalization)

그러나 이미지는, 범위가 0과 255 사이로 정해져 있기 때문에 굳이 피쳐 스케일러를 사용할 필요없이 255로 그냥
나눠주기만 하면, 자동으로 0과1사이의 값으로 피쳐스케일링 됩니다.
X_train = X_train/255.0
X_test = X_test/255.0
255.0를 쓰는 이유는 딥러닝은 float으로 만들어줘야합니다.
표시 결과는 그냥 255와 같습니다.
 
 

4. 이미지데이터를 전부 일렬로 만들어주는 Flatten 이용해서 모델링 한다.

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten
model = Sequential()
model.add(Flatten()) #이미지 사이즈 계산해서 인풋레이어를 만들어줍니다.
#히든레이어 1개
model.add(Dense(units=128,activation='relu'))
#아웃풋레이어는 10개를 분류하는 문제입니다.
#노드 10개를 세팅하고 activation에 softmax를 설정합니다.
model.add(Dense(units=10,activation='softmax'))

Sequential: SEQUENCE layers 로 모델링

Flatten: 2차원, 3차원을 1차원으로 만드는 것

Dense: 뉴런을 레이어에 붙인다.

각 레이어는 activation function 이 필요하다.

Relu effectively means "If X>0 return X, else return 0" -- so what it does it it only passes values 0 or greater to the next layer in the network.

Softmax 여러개의 값 중에서 가장 큰 값을 선택. [0.1, 0.1, 0.05, 0.1, 9.5, 0.1, 0.05, 0.05, 0.05], 여기서 가장 큰 값을 1로 만들고 나머지는 0으로 만들어준다. [0,0,0,0,1,0,0,0,0]

 

5. 인공지능 트레이닝, 테스트

compile할때, optimizer와 loss를 설정하는데, 2개로 분류할때의 loss는 binary_crossentropy를 사용했었습니다.
 
3개 이상으로 분류하는 경우에선, y값이 어떻게 들어있는지 확인한 후, y값이 0,1,2,3,4... 이런식으로 레이블 인코딩으로
되어있는 경우는 sparse_categorical_crossentropy를 사용하고 y값이 원핫인코딩으로 들어있는 경우는 
categorical_crossentropy를 사용합니다.
model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.fit(X_train,y_train,epochs=5) #훈련시킵니다. (epochs는 반복)
#accuacy는 약 90% 나올거고, 5epoch라 금방 끝납니다.

80%의 train 데이터 파일로 학습을 완료했습니다.

이제 20%의 데이터 파일로 테스트를 진행합니다.

model.evaluate(X_test,y_test)#인공지능 테스트하기

어떤것을 많이 틀렸는지 확인 합니다.

이런 것은 confusion_matrix 로 확인합니다.

from sklearn.metrics import confusion_matrix
y_pred=model.predict(X_test) #테스트한 것을 y_pred변수로 저장
y_pred[0].argmax() #첫번째 사진을 뭐라고 맞췄는지 확인

 

6. 테스트 결과 그래프로 보기

y_pred_labels = y_pred.argmax(axis=1)
cm = confusion_matrix(y_test,y_pred_labels)
import seaborn as sb
sb.heatmap(data = cm, annot=True,fmt='.0f',cmap='RdPu')
plt.show()

총 인공지능의 정답 확률을 확인합니다.

from sklearn.metrics import accuracy_score
accuracy_score(y_test,y_pred_labels)