มาทำความรู้จัก Tensorflow

อะไรคือ Tensorflow

Tensorflow ก็คือ deep learning library ของกูเกิ้ล ที่กำลังเป็นดาวเด่นอยู่ในตอนนี้, โดยทาง Google ก็ได้ใช้ machine learning เพิ่มประสิทธิภาพกับผลิตภัณฑ์มากมาย ไม่ว่าจะเป็น เครื่องมือค้นหา (search engine), การแปลภาษา (translation), คำบรรยายภาพ (image captioning) และ เครื่องมือช่วยการเสนอแนะ (recommendations)

เพื่อช่วยให้เห็นภาพมากขึ้น Google นำ AI มาช่วยให้พัฒนาประสบการณ์ของผู้ใช้ ทั้งในแง่ความเร็วของผลลัพธ์ และ ในแง่ผลลัพธ์ที่ถูกต้องแม่นยำมากขึ้น อย่างเช่น ถ้าเราลองพิมพ์คำอะไรลงไปในช่องค้นหาล่ะก็ Google สามารถแนะนำคำต่อไป หรือคำที่สมบูรณ์ให้เราได้ทันทีเลย

Google ต้องการใช้ประโยชน์จาก machine learning กับชุดข้อมูลขนานใหญ่ เพื่อให้ผู้ใช้มีประสบการณ์การใช้งานที่ดีที่สุด โดยมีกลุ่มผู้ใช้เทคโนโลยีตัวนี้ราวๆ 3 กลุ่มด้วยกัน

  1. โปรแกรมเมอร์
  2. นักวิจัย
  3. นักวิทยาศาสตร์ข้อมูล

โดยที่กลุ่มคนทั้งสามกลุ่มสามารถใช้เครื่องชุดเดียวกัน มาพัฒนาต่อหรือปรับปรุงประสิทธิภาพได้ตามต้องการ

Google ไม่ได้มีเพียงแต่ชุดข้อมูลจำนวนมาก Google ยังถือครองคอมพิวเตอร์จำนวนมากที่สุดในโลกอีกด้วย ดังนั้น Tensorflow สร้างมาเพื่อใช้งานได้บนหลากหลายอุปกรณ์ Tensorflow เป็นหนึ่งในผลงานพัฒนาจาก Google Brain Team ทีมที่ถูกเป้าขึ้นมาเพื่อพัฒนา machine learning และ  deep learning โดยเฉพาะ

 ประวัติศาสตร์ Tensorflow

เมื่อไม่กี่ปีก่อนเทคโนโลยี deep learning ก็มีประสิทธิภาพในการจัดการข้อมูลปริมาณมหาศาลดีกว่า machine learning อยู่หลายเท่าตัว Google จึงเห็นว่าเทคโนโลยีนี้ สามารถนำมาพัฒนาผลิตภัณฑ์ของตนเองได้

Google จึงได้สร้างเฟรมเวิร์คที่ชื่อว่า Tensorflow ขึ้นมา เพื่อให้นักวิจัยและนักพัฒนาทำงานกับโมเดล AI ได้ เมื่อพัฒนาและปรับปรุงสักระยะหนึ่ง Tensorflow ก็ถูกปล่อยออกมาให้คนทั่วไปใช้งานได้

โดยเปิด open source ตั้งแต่ปี 2015 และปล่อยตัวสมบูรณ์ออกมาในปี 2017 พร้อมลิขสิทธิ์แบบ Apache Open Source ให้คนทั่วไปสามารถใช้งาน, ดัดแปลง และ แจกจ่ายตัวที่ถูกดัดแปลงมาแล้ว โดยที่ไม่จำเป็นต้องจ่ายให้ Google เลย

สถาปัตยกรรม Tensorflow

ด้านสถาปัตยกรรมแบ่งเป็น 3 ส่วน

  1. การเตรียมประมวผลข้อมูล
  2. การสร้างแบบจำลอง
  3. ฝึกและประเมินแบบจำลอง

ชื่อของ Tensorflow มาจาก การที่ Tensorflow รับข้อมูลเป็นอาร์เรย์หลายมิติ หรือที่เรียกกันว่า tensors และเรามีหน้าที่จัดเรียงลำดับการประมวลผลเป็น flowchart (หรือที่เรียกว่ากราฟ) ข้อมูลที่ถูกป้อนไป ก็จะผ่าน (flow) กระบวนการจนออกมาเป็นผลลัพธ์ หรือ เอาท์พุท

นั่นจึงเป็นเหตุผลที่ได้ชื่อ Tensorflow เพราะว่า tensor ผ่านกระบวนการมากมายก่อนจะออกมาเป็นผลลัพธ์

แพลตฟอร์มที่รับรอง Tensorflow

Tensorflow ก็มีสเปคฮาร์ดแวร์ขั้นต่ำสำหรับใช้งานด้วยเช่นกัน โดยแบ่งเป็น

ช่วงการพัฒนา เป็นช่วงที่ให้นักพัฒนาสามารถฝึกฝน  Tensorflow ให้เก่งขึ้น โดยพัฒนาผ่านคอมพิวเตอร์ตั้งโต๊ะ

ช่วงการสรุปผล เมื่อการพัฒนาจบลง Tensorflow สามารถทำงานได้หลายแพลตฟอร์ม

  • คอมพิวเตอร์ตั้งโต๊ะที่ใช้ระบบปฎิบัติการ Windows, macOS or Linux
  • คลาวด์หรือเว็บเซอร์วิซ
  • มือถือทั้ง iOS and Android

เราสามารถฝึก Tensorflow จากคอมพิวเตอร์หลายเครื่อง ทำงานได้จากหลากหลายอุปกรณ์ เมื่อเรามีโมเดลจำลองการฝึกแล้ว (Train Model)

โมเดลจำลองการฝึกสามารถใช้การประมวลผลได้ทั้ง CPUs และ GPUs ถึงแม้ GPUs จะถูกออกแบบมาเพื่อเล่นเกม แต่ในช่วงปลายปี 2010 นักวิจัยจากมหาวิทยาลัยสแตนฟอร์ดก็พบว่า GPUs สามารถทำงานได้ดีและรวดเร็วกับการคำนวณทางคณิตศาสตร์เช่นกัน อย่างเมทริกซ์และพีชคณิต เมื่อต้องจะหาผลคูณเมทริกซ์จำนวนมาก รวมถึง Tensorflow ประมวลผลในเรื่องนี้ได้เร็วมาก Tensorflow ถูกเขียนขึ้นจากภาษา C++ และ Python

สุดท้าย ฟีเจอร์สำคัญของ Tensorflow ก็คือ TensorBoard ฟีเจอร์นี้เป็น GUI ที่ช่วยให้นักพัฒนาเห็น กระบวนการทำงานของ Tensorflow ได้

ส่วนประกอบของ Tensorflow

Tensor

ชื่อของ Tensorflow มาจากชื่อเฟรมเวิร์กที่ถูกนำมาพัฒนาต่ออย่าง Tensor การคำณวนทั้งหมดจึงเกี่ยวข้องเวกเตอร์ และ เมทริกซ์หลายมิติ ที่มีข้อมูลจุอยู่หลายหลากชนิด ค่าทั้งหมดในหนึ่ง Tensor จะมีขนาดของข้อมูลแตกต่างกันไปที่เรียกว่า shape

Tensor จะมาจากอะไรก็ได้ทั้งข้อมูลที่ป้อนเข้าไป หรือ ผลลัพธ์จากการคำนวณ ใน Tensorflow การคำนวณทั้งหมดจะเกิดขึ้นภายใน graph graph ก็คือลำดับของการประมวลผลอย่างต่อเนื่อง ในแต่ลำดับก็มีชื่อเรียกว่า op node และแต่ละ op node ก็เชื่อมถึงกัน

graph เป็นโครงสร้างของตัวประมวลตัวและการเชื่อมต่อกันนะหว่าง node แต่ graph ไม่ได้เป็นตัวแสดงผล และในแต่ละ node ก็มี tensor อยู่มากมายที่รอประมวลผล

Graphs

Tensorflow ก็ใช้ graph เฟรมเวิร์กด้วย โดย graph จะเป็นตัวรวบรวมและอธิบายชุดการคำนวณทั้งหมดในระหว่างการฝึก graph จึงมีประโยชน์มากมายทั้ง

  • สามารถทำงานผ่าน CPUs และ GPUs ได้หลายตัว ทั้งยังทำงานผ่านมือถือได้
  • ความสามารถในเรื่องการพกพา ทำให้สามารถหยิบใช้งานได้อย่างทันที และสามารถบันทึก graph เพื่อดำเนินการต่อในอนาคต
  • การคำนวณทั้งหมดใน graph เกิดจาก tensor ที่เชื่อมไว้ด้วยกัน
    • tensor ประกอบด้วยโหนด และ เอดจฺ ส่วนกลางจะมีชุดการคำนวณทางคณิตศาสตร์ และสร้างผลลัพธ์เป็นเอาท์พุท เอดจฺคือ input/output ที่เชื่อมต่อกันระหว่างโหนด

แล้วอะไรทำให้ Tensorflow ดังมาก

ความดังของ TensorFlow เกิดจากมันถูกสร้างมาเพื่อให้ทุกคนเข้าถึงได้ง่าย TensorFlow ได้รวมเอา API ที่แตกต่างกัน เพื่อสร้างสถาปัตยกรรมแบบ deep learning อย่าง CNN และ RNN; TensorFlow ยังมี graph เป็นตัวคำนวณหลัก มันช่วยให้นักพัฒนาเห็นภาพโครงสร้าง neural network กับ Tensorboad เครื่องมือที่ช่วยให้นักพัฒนาหาบั๊ก สุดท้าย Tensorflow ปรับสเกลประมวลผลได้ ให้ทำงานได้ CPUs และ GPUs

Tensorflow เป็นที่ต้องตานักพัฒนามากที่สุดใน GitHub เมื่อเปรียบเทียบกับเฟรมเวิร์ก deep learning อื่นๆ

รายการอัลกอริทึมเด่นๆที่ Tensorflow รองรับ

  • Linear regression: tf.estimator.LinearRegressor
  • Classification:tf.estimator.LinearClassifier
  • Deep learning classification: tf.estimator.DNNClassifier
  • Deep learning wipe and deep: tf.estimator.DNNLinearCombinedClassifier
  • Booster tree regression: tf.estimator.BoostedTreesRegressor
  • Boosted tree classification: tf.estimator.BoostedTreesClassifier

ตัวอย่าง Tensorflow

import numpy as np
import tensorflow as tf

ในสองบรรทัดแรก เรา import ตัว tensorflow มาในชื่อ tf ธรรมเนียมของภาษา Python มักจะใช้ตัวย่อตามการออกเสียงชื่อไลบรารี่นั้นๆ เมื่อเราพิมพ์ ts ก็สามารถใช้ function ต่างๆที่ tenorflow มีให้ได้เลย

ลองมาเริ่มจากอะไรที่ง่ายๆกันก่อน ด้วยการให้ tensorflow หาผลคูณของตัวเลขสองตัว

ในตัวอย่างนี้เราจะหาผลคูณของ X_1 และ X_2 tensorflow จะไปสร้างโหนดเพื่อเชื่อมต่อในการดำเนินการแต่ละครั้ง จากภาพคือการคูณ เมื่อ graph ถูกกำหนดแล้ว Tensorflow จึงเริ่มหาผลคูณของ X_1 และ X_2

สุดท้ายเมื่อเราให้ tensorflow ทำงาน tensorflow ผลคูณจาก X_1 และ X_2 ก็จะปรากฎออกมาบนหน้าจอแสดงผล

มาเริ่มให้ X_1 และ X_2 เป็นค่าอินพุทของโหนด เมื่อโหนดถูกสร้างใน tensorflow เราต้องมาเลือกว่าจะให้ tensorflow สร้างโหนดชนิดอะไร โดยใช้ตัว placeholder ซึ่ง placeholder จะ assign ค่าใหม่ให้อัตโนมัติทุกครั้งที่เกิดการคำนวณ

ขั้นแรกประกาศตัวแปร

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

เราประกาศตัวแปรผ่านตัว placeholder  โดยประกาศชนิดของข้อมูลเป็นพารามิเตอร์แรก ในที่นี้คือ tf.float32 ที่สามารถให้เราแปลงตัวแปรเป็นเลขทศนิยมได้ ต่อมาพารามิเตอร์ที่สองคือชื่อของโหนด ทั้ง X_1 และ X_2 จะแสดงออกมาตอนโชว์แสดงภาพ

ขั้นสองเลือกการคำนวณ

multiply = tf.multiply(X_1, X_2, name = "multiply")

ตอนนี้เราสามารถกำหนดโหนดที่ใช้สำหรับคูณได้ ผ่าน tf.multiply

เราผ่านค่าพารามิเตอร์ X_1 และ X_2 ไปในโหนดให้ชื่อว่า multiply เพื่อให้ tensorflow รู้ว่าดึงค่าจากตัวแปร X_1 และ X_1

ขั้นสามเริ่มทำงาน

ในการทำงานเราต้องสร้างเซสชั่นขึ้นมา โดยเขียน tf.Session() ที่นี้เราจะให้เซสชั่นทำงานโดยสั่ง session.run

เมื่อเริ่มการทำงาน เซสชั่นต้องการจะนำค่าของ X_1 และ X_2 เราจะต้องบอกเซสซั่นว่า ใน X_1 และ X_2 นั่นมีค่าอะไรบ้าง ผ่านพารามิเตอร์ที่ชื่อ feed_dict โดยให้ค่า 1,2,3 กับ X_1 และ 4,5,6 กับ X_2

แสดงผลด้วย print(result) เราควรเห็นค่า 4, 10 และ 18 ออกมา เกิดจาก 1 x 4, 2 x 5 และ 3 x 6 ตามลำดับ

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

multiply = tf.multiply(X_1, X_2, name = "multiply")

with tf.Session() as session:
    result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
    print(result)
[ 4. 10. 18.]

ตัวเลือกในการโหลดข้อมูลเข้าสู่ Tensorflow

ก่อนที่จะเริ่มฝึก Machine Learning ขั้นตอนโหลดข้อมูลมี 2 วิธีด้วยกัน

  1. โหลดข้อมูลลงในหน่วยความจำ เป็นวิธีที่ง่ายที่สุด โหลดข้อมูลทั้งหมดลงในหน่วยความจำแบบอาร์เรย์เดี่ยว เราเขียนเพียงแค่ Python ไม่ต้องเขียน Tensorflow เพิ่มเติม
  2. Tensorflow data pipeline โดยตัว Tensorflow มี API ที่ช่วยเราโหลดข้อมูล ดำเนินการและป้อนอัลกอริทึมให้ตัว machine learming อย่างง่ายดาย สำหรับวิธีนี้ยิ่งข้อมูลใหญ่มากเท่าไหร่ วิธีนี้ก็ลดความยุ่งยากลงได้อย่างมาก อย่างเช่น รูปภาพที่ทั้งใหญ่ และไม่เหมาะที่จะยัดลงไปในอาร์เรย์ แต่ตัว pipeline สามารถจัดการข้อมูลแบบนี้ได้ด้วยตัวเอง

วิธีแก้ปัญหาที่ใช้

โหลดข้อมูลจากหน่วยความจำ

ถ้าข้อมูลไม่ได้มีขนาดใหญ่มาก คือ น้อยกว่า 10 กิกกะไบท์ สามารถใช้วิธีนี้ได้ เพราะว่าข้อมูลสามารถลงเข้ากับหน่วยความจำได้ สำหรับข้อมูลแบบนี้เรายังใช้ library ดังๆหลายตัวอย่าง Pandas นำเข้ามาเป็นไฟล์ CSV จะได้เห็นในตัวอย่างถัดไป

โหลดข้อมูลจาก Tensorflow pipeline

วิธีที่สองเป้นวิธีที่ใช้กับข้อมูลที่มีขนาดใหญ๋ ตัวอย่าง หากเรามีข้อมูล 50 กิกกะไบท์ แต่เรามีหน่วยความจำเพีบงแค่ 16 กิกกะไบท์ การจะโหลดข้อมูล 50 กิกกะไบท์ มาใส่ในหน่วยความจำแต่ทำให้เครื่องเราเกิดอาการค้างได้

ดังนั้นเพื่อแก้สถาณการณ์แบบนี้ เราต้องสร้าง tensorflow pipeline ขึ้นมา โดยตัว pipeline จะแบ่งข้อมูลออกเป็นก้อนเล็กๆ ก้อนข้อมูลแต่ละก้อนจะถูกนำเข้า pipeline เพื่อเตรียมพร้อมสำหรับการฝึก การสร้าง pipeline ช่วยให้เราใช้ parallel computing ได้ด้วย นั่นคือการฝึกโมเดล machine learning ร่วมกันจาก CPUs หลายๆตัวได้

เราจะได้เห็นวิธีการสร้าง pipeline และวิธีป้อนข้อมูลเข้าสู่ pipeline กันในตัวอย่างหน้า

กล่าวโดยสรุปก็คือ หากเรามีข้อมูลขนาดเล็ก (ที่เพียงพอต่อแรม) เราสามารถโหลดข้อมูลเหล่านั้นได้ โดยใช้ไลบรารี่อย่าง Pandas

หากเรามีข้อมูลขนาดใหญ่และต้องการการทำงานจาก CPUs หลายตัว เราจะรู้สึกดีกับ tensorflow pipeline มากขึ้น

สร้าง Tensorflow pipeline

ในตัวอย่างที่แล้ว เราได้สร้างตัวแปรทั้ง X_1 และ X_2 รวมถึงโมเดลการคำนวณเอาไว้แล้ว ตอนนี้เรามาดูว่าจะโหลดข้อมูลเข้าสู่ pipeline อย่างไร

ขั้นแรก โหลดข้อมูล

ก่อนอื่น ให้ numpy สุ่มตัวเลขจำนวน 2 ตัวขึ้นมาก่อน

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

--> [0.8835775 0.23766977]

ขั้นที่สอง สร้างตัว placeholder

ตัว placeholder คล้ายกับตัวอย่างที่แล้ว ในตอนนี้เราจะสร้าง placeholder ให้ชื่อมันว่า X  แต่คราวนี้เราต้องระบุหน้าตาของอาร์เรย์ให้ tensor รับรู้ด้วย ในที่นี้ เราจะโหลดข้อมูล array ที่มีค่าแค่สองค่าเท่านั้น เราก็เขียนลงไปว่า shape=[1,2]

# using a placeholder
x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

ขั้นที่สาม กำหนด Method ของชุดข้อมูล

ในขั้นตอนนี้ เราจะกำหนดว่าจะป้อนข้อมูลอะไรเข้าไปให้ placeholder x เราทำได้ผ่าน method ที่ชื่อว่า tf.data.Dataset.from_tensor_slices

dataset = tf.data.Dataset.from_tensor_slices(x)

ขั้นที่สี่ สร้าง pipeline

ในขั้นตอนนี้ เราเริ่มต้นด้วยการกำหนดว่าข้อมูลจะมาจากที่ใด ด้วยการสร้างตัว iterator ด้วย make_initializable_iterator เราตั้งชื่อมันใหม่ว่า iterator เมื่อเราเรียก iterator เพื่อป้อนข้อมูลชุดถัดไป ด้วย iteraror.get_next() แต่จะขอตั้งชื่อใหม่ว่า get_next อย่าลืมว่าในตัวอย่าง ข้อมูลเราเป็นเพียงตัวเลข 2 ค่าเท่านั้น

iterator = dataset.make_initializable_iterator() 
get_next = iteraror.get_next()

ขั้นที่ห้า ดำเนินการทำงาน

ขั้นตอนสุดท้ายนี้เหมือนกับขตัวอย่างที่แล้ว เราสร้างตัวเซสชั่น เราให้ตัว iterator ทำงาน ตัวป้อนข้อมูลที่ได้จาก numpy ผ่าน feed_dict ข้อมูลทั้งสองตัวจะเข้าไปอยู่ใน placeholder x จากนั้นเราก็รันตัว gen_next เพื่อแสดงผลลัพธ์สุดท้ายออกมา

with tf.Session() as sess:
    # feed the placeholder with data
    sess.run(iterator.initializer, feed_dict={ x: x_input }) 
    print(sess.run(get_next)) # output [ 0.52374458  0.71968478]
[0.8835775  0.23766978]

สรุป

TensorFlow ที่ไลบรารี่ deep learning ที่โด่งดังมากในช่วงไม่กี่ปีที่ผ่านมา ทุกคนสามารถใช้ TensorFlow เพื่อสร้าง deep learning ของตัวเองกันได้ง่ายๆ ทั้ง CNN, RNN หรือ AI แบบง่ายๆ

TensorFlow เป็นที่นิยมในภาคการศึกษา สตาร์อัพ และ บริษัทขนานใหญ่ด้วย กูเกิ้ลใช้ Tensorflow ในเกือบทุกผลิตภัณฑ์ที่เราใช้ในชีวิตประจำวันเช่น Gmail, Photo และ Google Search Engine

ทีม Google Brain เป็นผู้พัฒนา TensorFlow เพื่อลดช่องว่างระหว่างนักวิจัยและตัวนักพัฒนา ในปี 2015 TensorFlow ปล่อยออกสู่สาธารณะ และชุมชน TensorFlow ก็เติบโตอย่างรวดเร็ว ในทุกวันนี้ TensorFlow คือ deep learning ที่มีจำนวน repositories สูงสุดใน GitHub

ผู้ต้องการใช้ TensorFlow สามารถทำงานผ่าน cloud หรืออุปกรณ์มือถือ อย่าง iOS และ Andriod

Tensorflow ทำงานเป็นเซสชั่น แต่ละเซสชั่นก็ถูกกำหนดโดย graph ที่มีโมเดลการคำนวณแตกต่างกัน ยังพอจำตัวอย่างหาผลคูณได้อยู่ไหม ที่เราต้อง

1.ประกาศตัวแปร

X_1 = tf.placeholder(tf.float32, name = "X_1")
X_2 = tf.placeholder(tf.float32, name = "X_2")

2.ประกาศการคำนวณ

multiply = tf.multiply(X_1, X_2, name = "multiply")

3.ดำเนินการ

with tf.Session() as session:
result = session.run(multiply, feed_dict={X_1:[1,2,3], X_2:[4,5,6]})
print(result)

และอีกวิธีคือสร้าง pipeline

1.สร้างข้อมูล

import numpy as np
x_input = np.random.sample((1,2))
print(x_input)

2.สร้างตัว placeholder

x = tf.placeholder(tf.float32, shape=[1,2], name = 'X')

3.กำหนด method ให้กับชุดข้อมูล

dataset = tf.data.Dataset.from_tensor_slices(x)

4.สร้าง  pipeline

iterator = dataset.make_initializable_iterator() 
get_next = iteraror.get_next()

5.ดำเนินการ

with tf.Session() as sess:  
sess.run(iterator.initializer, feed_dict={ x: x_input })  
print(sess.run(get_next)) 

PRACTICAL AI DEVELOPMENT BOOTCAMP
จะช่วยเปิดมุมมองพัฒนาการของเทคโนโลยีและงานวิจัยที่เกี่ยวข้องกับ AI
ให้แก่ผู้เรียนในหลายๆแง่มุม พร้อมทั้งให้ผู้เรียนได้ฝึกพัฒนา AI เพื่อใช้งานได้จริง
รายละเอียดเพิ่มเติมและสมัครที่นี่
หลักสูตรยาว 12 ครั้ง รวมเวลากว่า 72 ชั่วโมง จบมาทำงานได้จริง
ราคาคุ้มค่าที่สุด ตอนนี้มี promotion มา 2 คนลดเพิ่ม 10% 3 คนลดเพิ่ม 15%
สามารถขอ code ส่วนลดได้ที่ page LEAN upskill
Ai