การจำแนกเสื้อผ้า (Fashion MNIST) โดยใช้ CNN อย่างง่ายบน Tensorflow + Keras



โค้ดเต็ม

# 1. Import libraries

import keras
print(keras.backend.backend()) 
import tensorflow as tf
print(tf.__version__)

# 2. Load dataset

from keras.datasets import fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

# 3. Display a train image

print(x_train.shape) 
print(x_train[0]) 

import matplotlib.pyplot as plt
plt.imshow(x_train[0]) 
plt.show()
plt.imshow(x_train[0], cmap = plt.cm.binary) 
plt.show()

print(y_train[0])

# 4. Normalized matrix of images

x_train = tf.keras.utils.normalize(x_train, axis=1) 
x_test = tf.keras.utils.normalize(x_test, axis=1)

# 5. Display a train image again to see the difference

print(x_train[0]) 
plt.imshow(x_train[0]) 
plt.show()
plt.imshow(x_train[0], cmap = plt.cm.binary) 
plt.show()

# 6. Build a model

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

model = Sequential()
model.add(Flatten(input_shape=[28,28])) 
model.add(Dense(20, activation='relu')) 
model.add(Dense(10, activation='softmax'))

print(model.summary())

# 7. Train the model with train images

model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])
model.fit(x_train, y_train, epochs=3) 

val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)

# 8. Display a test image

print(x_test.shape)
print(x_test[0]) 
plt.imshow(x_test[0]) 
plt.show()
print(y_test[0]) 

# 9. Predict the test image

results = model.predict(x_test)
print(results[0])

import numpy as np
np.argmax(results[0])

คำอธิบาย

1. โหลด keras หรือ tf ปกติ keras เหมือนว่า tf เป็น default backend อยู่แล้ว จริงๆเรียกแค่ keras. ก็ได้ แต่ถ้า import tf มา ต้องเรียกเป็น tf.keras.
import keras
keras.backend.backend()
import tensorflow as tf
tf.__version__


2. โหลด dataset
from keras.datasets import fashion_mnist
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()

3. ลอง print แสดงผลตัวภาพที่จะเทรนดูว่าเป็นยังไง

3.1 แสดง จำนวนภาพ, ขนาด array แถว, คอลัมน์
print(x_train.shape) 

ได้ผลลัพธ์ (60000, 28, 28)

3.2 แสดงภาพ ซึ่งจะเป็น array([[...]], dtype=uint8) ของ pixel ในภาพหนึ่งๆ
print(x_train[0]) 
#[[a<0,1>, .., a<0,27>], .., [a<27,1>, .. a<27,27>]] เมื่อ a แทนค่า color ใดๆ ที่มี range ระหว่าง 0-255


3.3 แสดงเป็นรูปภาพขนาด 28x28 pixel แบบสีและขาวดำ
import matplotlib.pyplot as plt
plt.imshow(x_train[0])
plt.show()
plt.imshow(x_train[0], cmap = plt.cm.binary)
plt.show()


3.4 แสดง Label ของภาพ (เป็นตัวเลขระหว่าง 0 ถึง n-1 เมื่อ n คือจำนวน class ที่เราแบ่งประเภท)
print(y_train[0])

ได้ผลลัพธ์ 9

4. ทำการ Normalize เมตริกซ์ ให้ค่าจาก 0-255 กลายเป็นอยู่ระหว่าง 0-1
x_train = keras.utils.normalize(x_train, axis=1)
x_test = keras.utils.normalize(x_test, axis=1)

หรือจะหาร 255 ตรงๆ เลยก็ได้
x_train = x_train/255
x_test = x_test/255

5. ลองแสดงผลดูอีกครั้ง จะเห็นว่าภาพสีจางลง
print(x_train[0])
plt.imshow(x_train[0])
plt.show()
plt.imshow(x_train[0], cmap = plt.cm.binary)
plt.show()



6. สร้าง model เพิ่มชั้น layer
from keras.models import Sequential
from keras.layers import Dense, Activation, Flatten

6.1 เลือกโมเดลแบบ Sequential
model = Sequential()

6.2 เลือก Input Layer แบบ Flatten (คือการทำให้เวคเตอร์หลายมิติ กลายเป็นเวคเตอร์มิติเดียว) ใส่ shape เป็นขนาดภาพ
model.add(Flatten(input_shape=[28,28]))

6.3 เลือก Hidden Layer ใส่จำนวน neutron ที่ต้องการ ส่วนตัวอย่าง activation function เช่น step, sidmoid, relu
model.add(Dense(20, activation='relu'))

6.4 เลือก Output Layer ใส่ จำนวนคลาสของประเภทผลลัพธ์ตามที่เราแบ่ง ในที่นี้คือมีเสื้อผ้า 10 แบบ ใส่ softmax activation ซึ่งเป็นฟังก์ชันที่กำหนดให้ค่าความน่าจะเป็นแปลงเป็นค่าระหว่าง  0-1
model.add(Dense(10, activation='softmax'))

6.5 แสดงข้อมูลสรุปของ model
print(model.summary())


7. การ train ข้อมูล

7.1 compile โดย 1) เลิอก loss function เพราะปกติเราไม่หา accuracy ตรงๆ แต่เราพยายามหา loss ที่น้อยที่สุด 2) optimizer is an algorithm that help you adjust the weights of edges as you are doing the training 3) What kind of metrics you want to use
model.compile(loss="sparse_categorical_crossentropy", optimizer="adam", metrics=["accuracy"])

7.2 ทำการเทรนด้วย fit function สามารถระบุ epochs คือจำนวนวงรอบการเทรน ถ้าไม่ระบุ default = 1 รอบ
model.fit(x_train, y_train, epochs=5)


7.3 ประเมินค่า loss และ accuracy
val_loss, val_acc = model.evaluate(x_test, y_test)
print(val_loss, val_acc)


8. เลือกรูปภาพที่จะทำนาย แสดงข้อมูล
print(x_test.shape) #(10000, 28, 28)
print(x_test[99])
plt.imshow(x_test[99])
plt.show()
print(y_test[99])


ได้ผลลัพธ์ 2

9. การ predict

9.1 เก็บค่า predict ของทุกรูป
results = model.predict(x_test)

9.2. แสดงผลค่าความเป็นไปได้ในแต่ละคลาสของรูปที่ทำนาย ซึ่งจะเป็น array([ ... ], dtype=float32) ค่าไหนเยอะสุด แปลว่ารูปอยู่ในคลาสนั้น
print(results[99])


9.3 เลือกค่ามากสุดโดย argmax function

import numpy as np
np.argmax(results[99])

ได้ผลลัพธ์ 2
Previous
Next Post »