วันอาทิตย์ที่ 16 กันยายน พ.ศ. 2561

TensorFlow กับรูปภาพตัวเลข MNIST Data เบื้องต้น



MNIST Data เป็น Data set ยอดฮิตอีกตัวอีกตัว ใช้สำหรับเรียนรู้การทำ Machine Learning ที่เกี่ยวกับรูปภาพปูทางไปสู่ CNN (Convolutional Neural Networks) ต่อไป สำหรับในตอนนี้จะลองนำข้อมูลนี้มาใช้ทดสอบการแยกแยะตัวเลขดู โดยใช้วิธีที่พื้นฐานที่สุด นั่นคือการถดถอยโลจิสติกแบบมัลติโนเมียล (การถดถอยซอฟต์แม็กซ์)

มารู้จัก MNIST Data Set กันก่อน ถ้าเราไม่รู้จักข้อมูลเราจะแก้ไขปัญหาไม่ได้แน่นอน ข้อมูล MNIST เป็นข้อมูลรูปภาพตัวเลข 0–9 ที่เขียนด้วยมือ เพื่อใช้ทำการฝึกทำนายว่ารูปตัวเลขดังกล่าวเป็นเลขอะไร


ด้วยความที่เข้าใจได้ทั่วโลก 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]




มาดูการจัดการ Array ของ Label ที่ใช้เก็บรูปตัวเลขนี้กันบ้าง สมมุติถ้าเป็นเลข 4 เราจะ label มันด้วย array : [0,0,0,0,1,0,0,0,0,0] จะเห็นว่าเลข 1 อยู่ในตำแหน่งที่ 5 เพราะเราเริ่มต้นที่เลข 0 ไล่ไปจนถึง 9 นั่นเอง ดังนั้นสุดท้ายแล้ว lable ของข้อมูล Test ชุดนี้จะแทนด้วย array ขนาด (10,55000) ถ้าจะให้เห็นภาพก็ตามด้านล่างนี้เลย


เราจะใช้ Softmax มาเป็น Activate Function เพราะ Function นี้จะให้ค่าออกมาตั้งแต่ 0 ถึง 1


Network ที่เรากำลังจะทำ หน้าตาจะคล้ายๆด้านล่าง



จากรูป Network ได้ความว่า



จัดรูปแบบ Vectorize ซะใหม่ ให้ W และ x ในรูป vector การคูณ แล้วค่อยบวกด้วย vector b กลายร่างเป็น


ร่างสุดท้ายที่จะเอาไปใช้ใน TensorFlow



ขั้นตอนการทำงาน


ก่อนการทำงานให้ติดตั้ง  TensorFlow และ Keras ตามลิงค์ด้านล่าง

การติดตั้ง 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)



# ตรวจสอบความพร้อมของทั้ง train set และ test set

type(mnist)



mnist.train.images



# จำนวนรูป train ทั้งหมด 55000 รูป

mnist.train.num_examples



# จำนวนรูป test ทั้งหมด 10000 รูป

mnist.test.num_examples



# สุ่มหยิบตัวอย่างรูปมาดู

import matplotlib.pyplot as plt


# รูปจะถูกเก็บไว้ใน array(784,1)


mnist.train.images[1].shape



# เปลี่ยน mode ให้เป็น gray scale โดยใส่ option cmap=’gist_gray’ เข้าไป ตรวจสอบ min และ max เพื่อดูว่าข้อมูลถูก normalize มาแล้วหรือยัง

image = mnist.train.images[1].reshape(28,28)

plt.imshow(image,cmap='gist_gray')




# ได้ normalize มาแล้ว min = 0

image.min()



# และ max = 1

image.max()



# จับเข้า 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 กันเถอะ

ไม่มีความคิดเห็น:

แสดงความคิดเห็น