[Create ML] สร้างโมเดล Machine Learning (Core ML 2) แบบง่ายๆด้วย Create ML จาก Apple

Kajornsak P.
6 min readJun 9, 2018

--

บทความนี้เป็นเพียงแค่ proof-of-concept การใช้งาน Create ML เท่านั้น หากจะนำไปใช้ในงาน Production อาจจะต้องมีการศึกษาเพิ่มเติมนะครับ เพราะมันยังเป็นแค่ beta อยู่ (แถมใช้ได้เฉพาะ iOS 12) จนกว่าจะ release อาจจะมีการเปลี่ยนแปลงได้นะครับ ณ ตอนนี้ก็เอาไว้เล่นสนุกๆแก้ขัดได้ก่อน

ในงาน WWDC 2017 หนึ่งในฟีเจอร์ใหม่จาก Apple คือ Core ML นั่นเอง ซึ่งเจ้า Core ML นั้นเป็น Framework ที่ช่วยให้สามารถใช้งาน Machine Learning model ต่างๆ ภายใน Platform ของ Apple ได้นั่นเอง ทั้ง iOS, watchOS, tvOS และ macOS

โดยหลักการคร่าวๆคือการเรียกใช้งาน pre-trained model ผ่านแอปของเรา โดยจะมีการกำหนด Input และ Output ของโมเดลเอาไว้ จากนั้นก็สามารถใช้งานได้อย่างง่ายๆเลย

ซึ่งการสร้างโมเดล Core ML หรือ mlmodel เนี่ย จะต้องใช้ coremltools ซึ่งเป็น python package ที่เอาไว้แปลงโมเดลจาก ML Framework ต่างๆเช่น Keras, Sci-kit learn, Caffe ให้กลายเป็น Core ML Model นั่นเอง

แล้วปัญหาของเดิมคืออะไรนะ

การสร้างโมเดลใน ML Framework ต่างๆนั้นมีความยาก-ง่ายไม่เท่ากัน ไหนจะจุดประสงค์ของแต่ละ Framework ที่ต่างกัน ขึ้นอยู่กับงานที่จะใช้ เช่น Image Classifying, Regression หรือ Tree ต่างๆ ซึ่งใช้ความรู้ด้าน Machine Learning พอสมควร บวกกับการที่ Framework เหล่านี้นั้นใช้ C++ หรือ Python ด้วย อาจจะไม่ถนัดนัก สำหรับนักพัฒนาที่ใช้ Swift อย่างพวกเรา

Create ML

ในปีนี้ WWDC 2018 ทาง Apple จึงออก Framework ตัวใหม่ออกมา เพื่อช่วยให้นักพัฒนาสามารถสร้าง Machine Learning Model ได้ด้วยตัวเอง ซึ่งก็คือ Create ML นั่นเอง

https://developer.apple.com/documentation/create_ml

โดยเจ้าตัว Create ML นั้น ไม่เหมือนกับ Framework อื่นๆที่ผ่านมาของ Apple ก็ตรงที่….มันถูกเขียนด้วย Swift 100% นั่นเอง!! เหมาะสำหรับนักพัฒนาสายนี้มากๆเลยทีเดียว

Prerequisites

  • iOS 12 Device (เนื่องจาก Core ML model ที่ได้ไม่รองรับ iOS 11 ณ ตอนที่เขียน)
  • Xcode 10 (ณ ตอนที่เขียนเป็น beta)
  • macOS 10.14 Mojave (อ่านว่า โม-ฮา-เว่ นะจ๊ะ) (ณ ตอนที่เขียนเป็น beta)

ใช้สองอย่างนี้เพราะว่าต้องการ SDK ของ macOS 10.14 นั่นเอง

ณ เวลาที่เขียนบทความ Create ML ยังคงเป็น Beta อยู่ ซึ่งสามารถสร้างโมเดลได้ประมาณ 4 ประเภทคือ

โดย Input ของแต่ละประเภทก็จะเหมือนกับ ML Framework อื่นๆเลย ก็คือ Image, Text และ Data table (ซึ่งปกติเราก็จะใช้ pandas กันใช่มั้ยหล่ะ หรือไม่ก็ load csv ลงเข้าไปใน R, ซึ่งใน Create ML ก็มี MLDataTable เหมือนกัน เพื่อช่วยจัดข้อมูลนั่นเอง)

มาดูแต่ละอย่างกันดีกว่า

MLImageClassifier

ตัวแรกของ Create ML คือการสร้าง Image Classifier เพื่อแยกของบางอย่าง ว่าสิ่งของนี้คืออะไร (เหมือนการทำ Image Labeling นิดๆ) โดยปกติแล้ว เราจะต้องเตรียมข้อมูลที่ labeled แล้ว เพื่อมาสอนให้โมเดลของเราสามารถแยกแยะได้ ซึ่งขนาดของโมเดลก็จะขึ้นอยู่กับหลายๆปัจจัย เช่นจำนวน parameters ในโมเดล, ความซับซ้อนของโมเดล และอีกมากมาย

https://www.kaggle.com/keras/inceptionv3

หนึ่งใน Image Classification Model ยอดฮิตคือ InceptionV3 ซึ่งเป็น CNN ที่มีความซับซ้อนพอสมควร โดยเจ้า InceptionV3 สามารถ classify ได้ถึง 1000 classes (ซึ่งถือว่าเยอะอยู่) แต่ถ้าเราต้องการ limit scope ของโมเดลเราหล่ะ เราจะทำได้ยังไง

สมมติว่าแบ่งการสร้างโมเดลออกเป็นสองประเภทคร่าวๆ คือ

  1. Train โมเดลเองทั้งหมด โดยอาจจะวาง Structure CNN เอง หรือลอกตามโมเดลที่มีอยู่แล้วเช่น VGG16,VGG19
  2. ใช้วิธี Transfer Learning จากโมเดลเก่าที่มีอยู่แล้ว โดยอาจจะ Train แค่บาง layer หรือทำการ fine-tuning เพิ่ม เพื่อให้เหมาะกับข้อมูลของเรา

ไม่ว่าจะวิธีไหน ก็ถือว่าค่อนข้างยากสำหรับ developer ที่ไม่ได้ทำสาย Machine Learning มาก่อน ต่อให้มี tools ช่วยแปลงเป็น Core ML ก็เถอะ

กลับมาที่ Create ML ของเรา

ภาพจาก Session 703 : Introducing Create ML

โดย Create ML นั้นเลือกที่จะใช้วิธี Transfer Learning ในการช่วยเราสร้างโมเดลใหม่นั่นเอง จากที่ฟังใน Session คิดว่าน่าจะใช้ Inception V3 เป็นหลัก (อาจจะต้องรอ Article/ Docs ที่ละเอียดกว่านี้ถึงจะคอนเฟิร์มได้)

วิธีสร้าง MLImageClassifier

การสร้าง MLImageClassifier นั้นทำได้สองวิธี ขึ้นอยู่กับนักพัฒนาว่าจะชอบ approach ไหนมากกว่ากัน ทั้งสองวิธีแตกต่างกันเล็กน้อย แต่ให้ผลที่เหมือนกันทั้งคู่ และ ง่าย ทั้งคู่เลย

  1. ใช้ MLImageClassifierBuilder สร้างผ่าน LiveView บน Playground (ง่ายมาก)
  2. ใช้ Swift สร้าง MLImageClassifier ขึ้นมาด้วยโค้ด (ง่ายรองลงมา)

MLImageClassifierBuilder

โดยเจ้าตัวนี้ จะต้องใช้ควบคู่กับ LiveView ใน Playground ด้วยนั่นเอง โดยขั้นตอนนั้นง่ายมาก

ขั้นแรก : สร้าง Playground ใหม่ โดยใช้ Target เป็น macOS

เลือก target เป็น macOS เน้อ

ขั้นที่สอง : import CreateMLUI เข้ามาแล้วสร้าง MLImageClassifierBuilder เลยจ้า

โค้ดมันก็จะสั้นนิดนีง

จากนั้นก็กด shift + enter เลยจ้า, อย่าลืมเปิด Assistant Editor นะ เพื่อใช้ LiveView

ใน LiveView จะมีขึ้น template การสร้างโมเดล ImageClassifier มาให้เรา โดยเราสามารถลาก Data เข้ามาเพื่อ train โมเดลได้ทันทีเลย หรือจะ customize ผ่าน การกด dropdown ก็ได้เช่นกัน

ค่าพวกนี้จะเรียกว่า ModelParameters นั่นเอง

โดย Structure ของ Data จะต้องอยู่ในรูปแบบที่กำหนดไว้เท่านั้น คือแบบนี้

โดยข้อมูลแบ่งออกเป็น 2 ประเภทคือ Training set และ Testing set โดยที่ Training set คือสิ่งที่ให้ Model นั้นเรียนรู้ และ Testing set เอาไว้ประเมิณผลของโมเดล

เนื่องจาก ImageClassifier นั้นรับรูปเป็น Input เราจึงสามารถวางรูปไปในโฟลเดอร์ได้เลย โดย Label ที่โมเดลใช้ในการเรียนรู้คือชื่อโฟลเดอร์นั้นๆนั่นเอง ดังนั้นตามรูปนี้ โมเดลเราจะสามารถแบ่งของได้ 2 ประเภทคือ หมาและแมว โดยอัตราส่วนข้อมูลจะอยู่ที่ 80:20 (Train 80% Test 20%)

เมื่อมีข้อมูลพร้อมแล้ว ก็ train ได้เลย

ด้วยความที่เป็น Tr+ ข้อมูลจำนวนไม่เยอะ (20รูปต่อคลาส) เลยเร็วมากก

เมื่อทำการ train โมเดลเสร็จแล้ว ก็ต้องประเมิณผลการทำงานของโมเดลเรานั่นเอง โดยการใช้ testing set เพื่อ evaluate มันซะ (ลากโฟลเดอร์มาแปะเหมือนเดิม)

Create ML จะทำการโยนรูปจาก testing set เข้าไปพร้อมกับเช็คว่าตรงตาม Label ที่มันควรเป็นรึเปล่า
ผลการ Evaluation

ที่ได้ Accuracy 100% เพราะจำนวน test ค่อนข้างน้อย และ task นี้ไม่ได้แตกต่างจากสิ่งที่ Inception V3 ทำได้อยู่แล้ว เลยไม่ใช่ task ที่ยากอะไร​ (เดี๋ยวโชว์อีกตัวอย่าง)

เมื่อเรา Train และ Test โมเดลเสร็จแล้ว หากผลเป็นที่น่าพอใจ เราก็จะสามารถนำโมเดล Core ML นี้ไปใช้ได้เลย แค่กดที่ dropdown แล้วกรอก Metadata ต่างๆ กด Save จบ~ ก็จะได้ Core ML model มาใช้งานแล้ว

Swift & MLImageClassifier

อีกวิธีนึงในการสร้างโมเดล MLImageClassifier คือการสร้างผ่าน Swift code นั่นเอง ซึ่งไม่ค่อยต่างกับวิธีแรกมากนัก ถือว่าใช้งานง่ายเช่นกัน

โดยครั้งนี้จะลอง Dataset ที่ใหญ่ขึ้นกว่าเดิม เลยไปเจอตัวนี้ Fruits-360 ซึ่งเป็น Dataset ของรูปผลไม้ ที่ถ่ายในมุมต่างๆ เลยลองเอามาทำ Fruit Classifier กัน

โค้ดก็ยังน้อยอยู่เช่นกัน เพียงแค่ชี้ไปยัง path ของ Dataset ให้ถูกก็เป็นอันจบ

ซึ่งระหว่างการ Train model ก็จะมี log ขึ้นให้ดู progress เรื่อยๆด้วย ซึ่งรวมๆแล้วของโมเดลนี้ใช้เวลาประมาณ 40 นาที (Training images ประมาณ 30k รูป)

ก็จะรันไปเรื่อยๆ จนกว่าจะ 100%

และหลังจากที่ Train เสร็จ ก็จะเข้าสู่ช่วง Validation phase เพื่อ validate โมเดล

และเมื่อ Validation เสร็จ ก็จะเป็นช่วง Evaluation เพื่อวัด Accuracy ของโมเดลจริงๆ

อีกประมาณ 10 นาที

รวมๆแล้วก็ใช้เวลาเกือบ 1 ชั่วโมง (ขึ้นอยู่กับสเปคคอมด้วย) จนกว่าจะได้ไฟล์ Core ML Model ออกมา ซึ่งสิ่งที่น่าสนใจของ Create ML ก็คือความสะดวกในการวัดผลต่างๆเนี่ยแหละ โดยที่ function evaluation ของโมเดลจะ return MLClassifierMetrics ที่เอาไว้วัดผลต่างๆของ Model Machine Learning ได้นั่นเอง ช่วยให้เราเข้าใจโมเดลมากขึ้น

https://developer.apple.com/documentation/create_ml/mlclassifiermetrics

เช่น Confusion Matrix ที่สามารถช่วยดูผลการ evaluate ได้ว่าโมเดล predict ว่าเป็นอะไรเมื่อเทียบกับสิ่งที่มันเป็นจริงๆ

อย่างอันนี้ผมเทรน MNIST ขนาดจิ๋ว โดยใช้ข้อมูลคลาสละ 10กว่ารูป แล้วเทส 9 รูปต่อคลาส (เพื่อโชว์ตาราง)
แถมยังช่วยหา Precision Recall ได้อีกด้วย (สะดวกมากเว่อร์)

เช่นเดียวกับการใช้ MLImageClassifierBuilder เราสามารถเอาโมเดลที่เซฟแล้วไปใช้ได้เลย อย่างโมเดล FruitClassifier ก็มีขนาดแค่ 1.1 MB เอง 😱

ใช้งานได้เหมือน Core ML Model ปกติเลย

คำเตือน !! Core ML Model ที่ได้จาก Create ML ตอนนี้จะใช้ได้กับ iOS 12 เท่านั้น ( Core ML 2 ) เพราะฉะนั้น iOS 11 ก็ต้องทำใจนาจา (อดใจรออีกไม่กี่เดือน)

มีผิดบ้างถูกบ้าง แต่ก็ถือว่ารับได้อยู่ เพราะยังเป็น beta และยังสามารถ tune model ได้อีกเยอะเลย (ตลกหน้าน้องหมา)

MLTextClassifier

ตัวที่สองของ Create ML ก็คือ Model Text Classifier นั่นเอง ซึ่งปกติแล้วงานด้าน Text Classifying เนี่ย จะเกี่ยวข้องกับ NLP สุดๆ ถ้าให้สร้าง model เองก็ยากอีกเช่นกัน (ไหนจะศึกษาเรื่อง RNN/LSTM หรือแค่ Word tagging ใน NLP ก็เหนื่อยแล้ว)

เราเพียงแค่เตรียมข้อมูลให้พร้อม แล้ว Create ML ก็จะสร้างออกมาให้เองเลยจ้า

ส่วนตัวผมไม่ได้ทำด้าน NLP โดยตรง เลยไม่สามารถลงรายละเอียดเกี่ยวกับเบื้องหลังของ MLTextClassifer ได้มากนัก แต่จากที่ลองเล่นดูก็ถือว่าค่อนข้างใช้งานง่ายอยู่เหมือนกัน

โดยข้อมูลที่นำมาใช้จะเป็น Review ใน Amazon โดยมี label คือ 1–5 (จำนวนดาวใน rating ตั้งแต่ 1–5) ซึ่งไปเจอใน kaggle มาอีกที

โดยข้อมูลที่นำมาใช้ จะอยู่ในรูปของ CSV หรือ JSON ก็ได้หากเป็นไฟล์เดี่ยวๆ หรือจะเก็บในโฟลเดอร์แบบตอนทำ ImageClassifier ก็ได้เช่นกัน โดยถ้าหากต้องการ clean ข้อมูลหรือจัดการอะไรต่างๆ แนะนำให้ทำข้างนอกก่อนจะดีกว่า (MLDataTable ยังทำอะไรได้ไม่มากนัก, pandas จึงตอบโจทย์มาก 555)

หน้าตาข้อมูลก็จะประมาณนี้ ถ้าเป็น JSON
จากนั้นก็ Train โมเดลได้เลย (คล้ายกับ ImageClassifier มาก)

จากนั้นก็รอไปยาวๆ (dataset เต็มๆขนาดใหญ่มากกก training 3M records แต่ด้วยความใจร้อนเลยหยิบมาแค่ 10K แหะๆ)

พอ Train เสร็จแล้วก็ save model ตามปกติได้เลย
ขนาดโมเดลก็แค่ 973 KB ซึ่งเล็กมากเว่อร์

พอลองนำไปใช้ก็พอโอเคอยู่นา สำหรับคนที่ไม่มีความรู้ด้าน NLP อย่างผม ถือว่าได้โมเดลที่เอาไปช่วยคิด rating ใน comment ต่างๆคร่าวๆได้เลย (เผื่อโชว์ suggestions ให้ผู้ใช้ส่ง feedback ไรงี้)

อันนี้แค่ 10K records ก็ได้ผลที่โอเคอยู่ หากใช้ full dataset น่าจะดีกว่านี้เยอะเลย

MLClassifier

ส่วนต่อมาคือการสร้าง Classifier ทั่วๆไป ซึ่งจะ Generic ออกมาหน่อย ซึ่งตัว Create ML นั้นก็รองรับ Classifier ชนิดต่างๆที่นิยมใช้กันอยู่แล้ว ซึ่งแต่ละแบบก็จะใช้ Algorithm ที่แตกต่างกันในการ classify เช่น Decision Tree หรือ SVM ดังนี้

https://developer.apple.com/documentation/create_ml/mlclassifier

MLRegressor

ส่วนสุดท้ายของ Create ML คือการทำ Regressor หรือ Regression model ซึ่งต่างจาก Classifier model ตรงที่จะไม่ได้บอกว่า Input ของโมเดลคืออะไร แต่จะ predict ค่าออกมาจาก Input ที่ได้รับ เช่น การคำนวนราคาบ้านคร่าวๆ จากจำนวนห้อง,ชั้น,พื้นที่ใช้สอย อะไรประมาณนี้ ซึ่งวิธีการทำ Regression นั้นมีอีกหลายแบบที่นิยมใช้กัน ขึ้นอยู่กับ Algorithm เช่นกัน ซึ่ง Create ML ก็รองรับเช่นกัน ได้แก่

https://developer.apple.com/documentation/create_ml/mlregressor

ซึ่งในส่วนของ MLClassifier และ MLRegressor นี้จะขอไม่ลงรายละเอียดมากนัก เพราะอาจจะลึกเกินไปสำหรับ iOS/macOS developer นิสนึง ซึ่งวิธีใช้งานแทบไม่ต่างกับตัวก่อนหน้าที่อธิบายมาเลย (prepare data -> train -> test -> deploy) แค่นี้จริงๆ เพียงแค่เตรียมข้อมูลที่ดีพอ และใช้ Algorithm ให้ตรงตามโจทย์ ก็สามารถเอาไปใช้ได้หลายอย่างแล้ว

สำหรับบทความนี้ ก็ขอจบไว้ที่เท่านี้ครับ ไว้มีโอกาสหน้าจะพามาลองทำ MLClassifier กับ MLRegressor กันอีกที หากมีอัพเดตอะไรเกี่ยวกับ Create ML จะนำมาเพิ่มให้เรื่อยๆครับผม ขอบคุณครับ~

--

--

Kajornsak P.
Kajornsak P.

Written by Kajornsak P.

Android & iOS developer. Interest in UI/UX design. Currently, Staff Software Engineer at Agoda — DevOps

No responses yet