Notice
Recent Posts
Recent Comments
Link
«   2025/06   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

응애 개발자

[MiniProject] fashion_mnist 본문

개발/인공지능

[MiniProject] fashion_mnist

응애개발자응애 2021. 12. 1. 11:08

사용한 예제

https://github.com/zalandoresearch/fashion-mnist#labels

 

GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark

A MNIST-like fashion product database. Benchmark :point_down: - GitHub - zalandoresearch/fashion-mnist: A MNIST-like fashion product database. Benchmark

github.com

 

 

10개로 분류된 패션 이미지를 분류하는 딥러닝 Example

import tensorflow as tf
print(tf.__version__)
2.7.0

Fashion MNIST 데이터는 tf.keras datasets API에 들어있다.

fashion_mnist = tf.keras.datasets.fashion_mnist
(X_train, y_train), (X_test, y_test) = fashion_mnist.load_data()

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

X_train
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, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0],
        [0, 0, 0, ..., 0, 0, 0]]], dtype=uint8)
X_train.shape
(60000, 28, 28)
X_test.shape
(10000, 28, 28)

이미지는 숫자로 되어있다. 0부터 255까지의 숫자로 되어있다.

# 첫번째 이미지를 가져오는 코드 ( X_train 은 numpy array )
X_train[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,   1,   0,
         69, 207, 223, 218, 216, 216, 163, 127, 121, 122, 146, 141,  88,
        172,  66],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   1,   1,   0,
        200, 232, 232, 233, 229, 223, 223, 215, 213, 164, 127, 123, 196,
        229,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        183, 225, 216, 223, 228, 235, 227, 224, 222, 224, 221, 223, 245,
        173,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
        193, 228, 218, 213, 198, 180, 212, 210, 211, 213, 223, 220, 243,
        202,   0],
       [  0,   0,   0,   0,   0,   0,   0,   0,   0,   1,   3,   0,  12,
        219, 220, 212, 218, 192, 169, 227, 208, 218, 224, 212, 226, 197,
        209,  52],
       ...
       [  0,   3,   0,   0,   0,   0,   0,   0,   0,  62, 145, 204, 228,
        207, 213, 221, 218, 208, 211, 218, 224, 223, 219, 215, 224, 244,
        159,   0],
       [  0,   0,   0,   0,  18,  44,  82, 107, 189, 228, 220, 222, 217,
        226, 200, 205, 211, 230, 224, 234, 176, 188, 250, 248, 233, 238,
        215,   0],
       [  0,  57, 187, 208, 224, 221, 224, 208, 204, 214, 208, 209, 200,
        159, 245, 193, 206, 223, 255, 255, 221, 234, 221, 211, 220, 232,
        246,   0],
       [  3, 202, 228, 224, 221, 211, 211, 214, 205, 205, 205, 220, 240,
         80, 150, 255, 229, 221, 188, 154, 191, 210, 204, 209, 222, 228,
        225,   0],
       [ 98, 233, 198, 210, 222, 229, 229, 234, 249, 220, 194, 215, 217,
        241,  65,  73, 106, 117, 168, 219, 221, 215, 217, 223, 223, 224,
        229,  29],
       [ 75, 204, 212, 204, 193, 205, 211, 225, 216, 185, 197, 206, 198,
        213, 240, 195, 227, 245, 239, 223, 218, 212, 209, 222, 220, 221,
        230,  67],
       ..., dtype=uint8)
X_train[0].shape
(28, 28)
import matplotlib.pyplot as plt
plt.imshow(X_train[0], cmap='gray')
plt.show()

X_train[0]의 이미지

y_train.shape
(60000,)
y_train[0]
9

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

# 우리가 기본적으로 하는 피처스케일링은 두가지를 많이 사용한다.
# StandardScaler  , MinMaxScaler 를 많이 사용한다.
# (Standartization, Normalization)

# 그러나, 이미지는 범위가 0~255 사이로 정해져있다..
# 굳이, 피처스케일러를 사용할 필요없이
# 255로 그냥 나눠주기만 하면, 자동으로 0과 1 사이의 값으로 피처스케일링한다.
# float 으로 처리하겠다! ( 물론 안써도 float 으로 처리함 )
X_train = X_train / 255.0
X_test = X_test / 255.0

이미지의 가로 세로를 전부 일렬로 만드는 작업이 flatten 이다.

모델을 만들어 보자.

28*28
784
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개를 셋팅하고, 엑티베이션함수에는 소프트맥스(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]

optimizer and loss function 으로 컴파일 한 후에 model.fit 함수로 학습한다..

# 컴파일 할때 옵티마이저와 로스를 설정하는데,
# 2개로 분류할때의 loss 는 binary_crossentropy 를 사용한다.

# 지금 문제 -> 3개 이상으로 분류하는 경우에서,
# y값이 어떻게 들어있는지 확인한 후,

# 1.  y 값이 0,2,3 ... 이런식으로 레이블 인코딩으로 되어있는 경우
#     sparse_categorical_crossentropy 를 사용하고
# 2.  y 값이 원핫인코딩으로 들어있는 경우는
#     categorical_crossentropy 를 사용한다.
y_train
array([9, 0, 0, ..., 3, 0, 5], dtype=uint8)
model.compile(optimizer='adam', 
              loss='sparse_categorical_crossentropy',
              metrics = ['accuracy'])
model.fit(X_train, y_train, epochs=5)
Epoch 1/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.4985 - accuracy: 0.8255
Epoch 2/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3732 - accuracy: 0.8647
Epoch 3/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3370 - accuracy: 0.8763
Epoch 4/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.3091 - accuracy: 0.8868
Epoch 5/5
1875/1875 [==============================] - 4s 2ms/step - loss: 0.2907 - accuracy: 0.8929





<keras.callbacks.History at 0x7f7d20e5e1d0>

accuracy 가 약 90% 라는 뜻. 5 epochs 라 금방 끝났다.

학습에 사용하지 않는, 테스트 데이터를 통해서, 얼마의 정확도가 나오는지 확인해 본다.

model.evaluate(X_test, y_test)
313/313 [==============================] - 1s 1ms/step - loss: 0.3586 - accuracy: 0.8721





[0.35861605405807495, 0.8720999956130981]
# 어떤것을 많이 틀리는지 확인한다.
# 이런것은 컨퓨전 매트릭스로 확인하는 것 !
from sklearn.metrics import confusion_matrix
y_pred = model.predict(X_test)
X_test.shape
(10000, 28, 28)
y_pred.shape
(10000, 10)
# y_test의 맥스값과 y_pred의 맥스값 비교
y_test[0]
9
y_pred[0].argmax()
9
y_pred_labels = y_pred.argmax(axis=1)
y_pred_labels
array([9, 2, 1, ..., 8, 1, 5])
y_test
array([9, 2, 1, ..., 8, 1, 5], dtype=uint8)
cm = confusion_matrix(y_test,y_pred_labels)
import seaborn as sb
sb.heatmap(data=cm, annot=True, fmt='.0f', cmap='RdPu')
plt.show()

정확도의 대한 heatmap

'개발 > 인공지능' 카테고리의 다른 글

Image Data FeatureScaling  (0) 2021.12.01
이미지와 행렬, GrayScale Image, Color Image  (0) 2021.12.01
Comments