MNIST Data เป็น Data set ยอดฮิตอีกตัวอีกตัว ใช้สำหรับเรียนรู้การทำ Machine Learning ที่เกี่ยวกับรูปภาพปูทางไปสู่ CNN (Convolutional Neural Networks) ต่อไป สำหรับในตอนนี้จะลองนำข้อมูลนี้มาใช้ทดสอบการแยกแยะตัวเลขดู โดยใช้วิธีที่พื้นฐานที่สุด นั่นคือการถดถอยโลจิสติกแบบมัลติโนเมียล (การถดถอยซอฟต์แม็กซ์)
ด้วยความที่เข้าใจได้ทั่วโลก TensorFlow เลือก Data Set ชุดนี้มาไว้ใน API เลย โดยมีจำนวนรูปสำหรับ Training 55,000 รูป รูปสำหรับ Test 10,000 รูป รูปสำหรับ Validation 5,000 รูป
รูปตัวเลขแต่ละรูปจะถูกนำมาแปลงเป็น 2D array ของ pixels ขนาด 28x28 และแทนด้วยตัวเลขตั้งแต่ 0–1 โดยสีขาวจะแทนด้วยเลข 0 และ สีดำแทนด้วยเลข 1 ส่วนในขั้นตอนการนำไปใช้ เราจะทำการ reshape array มาเป็น 28x28
จาก 1 รูป 28x28 Data set ทำการ แปลงให้เป็น 784x1 หรือ 1*784 แล้วแต่สะดวก ที่มาของเลข 784 มาจาก 28x28 = 784 เพราะต้องการที่จะจัดเรียงชุดข้อมูลให้อยู่ในรูปแบบที่สามารถอ้างอิงทีละรูปได้สะดวก 55,000 รูป จะกลายเป็น Array ขนาด (784,55000) ดังนั้นพอนึกภาพการ array ที่จะเอาไปใช้เทรนจะได้ตามรูปข้างล่างนี้ ถ้าอยากหยิบรูปลำดับที่ 0 มาใช้ก็แค่อ้างอิง array[0]
เราจะใช้ Softmax มาเป็น Activate Function เพราะ Function นี้จะให้ค่าออกมาตั้งแต่ 0 ถึง 1
จากรูป Network ได้ความว่า
การติดตั้ง TensorFlow และ Keras
เปิดโปรแกรม เทอมินอล (Root Terminal)
สร้างโฟลเดอร์ basic_mnist โดยใช้คำสั่ง
mkdir basic_mnist
เปิดโปรแกรม Python 3 (IDLE)
เขียนโค้ดดังนี้
# นำเข้า TensorFlow
import tensorflow as tf
# นำเข้า mnist data set
from tensorflow.examples.tutorials.mnist import input_data
old_v = tf.logging.get_verbosity()
tf.logging.set_verbosity(tf.logging.ERROR)
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
type(mnist)
mnist.train.images
# จำนวนรูป train ทั้งหมด 55000 รูป
mnist.train.num_examples
# จำนวนรูป test ทั้งหมด 10000 รูป
# สุ่มหยิบตัวอย่างรูปมาดู
import matplotlib.pyplot as plt
# รูปจะถูกเก็บไว้ใน array(784,1)
# เปลี่ยน mode ให้เป็น gray scale โดยใส่ option cmap=’gist_gray’ เข้าไป ตรวจสอบ min และ max เพื่อดูว่าข้อมูลถูก normalize มาแล้วหรือยัง
image = mnist.train.images[1].reshape(28,28)
# ได้ normalize มาแล้ว min = 0
image.min()
# และ max = 1
# จับเข้า Step ทำ Neural Network การทำ Neural Network แบบ Basic มีนั้นตอนดังนี้
1. PLACEHOLDERS
2. VARIABLES
3. CREATE GRAPH OPERATIONS
4. LOSS FUNCTION
5. OPTIMIZER
6. CREATE SESSION
7. EVALUATE MODEL
# PLACEHOLDERS
x = tf.placeholder(tf.float32,shape=[None,784])
# VARIABLES
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
# CREATE GRAPH OPERATIONS
y = tf.matmul(x,W) + b
# LOSS FUNCTION
y_true = tf.placeholder(tf.float32,[None,10])
# จับ y_true มาเทียบ lost กับ y ที่ predict ได้โดยใช้ softmax
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y))
# OPTIMIZER
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5)
train = optimizer.minimize(cross_entropy)
# หลังจากนั้นก็ run เพื่อดูผลความถูกต้อง
# CREATE SESSION
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(1000):
batch_x , batch_y = mnist.train.next_batch(100)
sess.run(train,feed_dict={x:batch_x,y_true:batch_y})
# EVALUATE THE MODEL
correct_prediction = tf.equal(tf.arg_max(y,1), tf.arg_max(y_true,1))
#[True,False,True...] --> [1,0,1,...]
acc = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print('Accuracy:',sess.run(acc,feed_dict={x:mnist.test.images,y_true:mnist.test.labels}))
โดยมีโค้ดทั้งหมดดังนี้
import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
old_v = tf.logging.get_verbosity()
tf.logging.set_verbosity(tf.logging.ERROR)
mnist = input_data.read_data_sets("MNIST_data/",one_hot=True)
type(mnist)
mnist.train.images
mnist.train.num_examples
mnist.test.num_examples
import matplotlib.pyplot as plt
plt.show()
mnist.train.images[1].shape
image = mnist.train.images[1].reshape(28,28)
plt.imshow(image,cmap='gist_gray')
image.min()
image.max()
# PLACEHOLDERS
x = tf.placeholder(tf.float32,shape=[None,784])
# VARIABLES
W = tf.Variable(tf.zeros([784,10]))
b = tf.Variable(tf.zeros([10]))
# CREATE GRAPH OPERATIONS
y = tf.matmul(x,W) + b
# LOSS FUNCTION
y_true = tf.placeholder(tf.float32,[None,10])
cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_true,logits=y))
# OPTIMIZER
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.5)
train = optimizer.minimize(cross_entropy)
# CREATE SESSION
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for step in range(1000):
batch_x , batch_y = mnist.train.next_batch(100)
sess.run(train,feed_dict={x:batch_x,y_true:batch_y})
# EVALUATE THE MODEL
correct_prediction = tf.equal(tf.arg_max(y,1), tf.arg_max(y_true,1))
#[True,False,True...] --> [1,0,1,...]
acc = tf.reduce_mean(tf.cast(correct_prediction,tf.float32))
print('Accuracy:',sess.run(acc,feed_dict={x:mnist.test.images,y_true:mnist.test.labels}))
หรือดาวน์โหลดโค้ดจากลิงค์ด้านล่าง
https://drive.google.com/open?id=1a62CZQfG0Vr-_HL5vQ6jOhMspyaQG1Vo
Save ไปที่ โฟลเดอร์ basic_mnist และตั้งชื่อเป็น test_mnist.py
Run Module
ผลลัพธ์การทำงานของโปรแกรม
สุดท้ายแล้วผลออกมา 91.62% ยัง ยังดีไม่พอรอดู CNN (Convolutional Neural Networks) ในตอนต่อไป
หมายเหตุ : เรียบเรียงและแก้ไขดัดแปลงจากบทความด้านล่าง
TensorFlow : มาเล่นกับ MNIST Data ด้วยวิธีแบบ Basic กันเถอะ
ไม่มีความคิดเห็น:
แสดงความคิดเห็น