응애 개발자
[MiniProject] fashion_mnist 본문
사용한 예제
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()
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()
'개발 > 인공지능' 카테고리의 다른 글
Image Data FeatureScaling (0) | 2021.12.01 |
---|---|
이미지와 행렬, GrayScale Image, Color Image (0) | 2021.12.01 |