Super Ai Image Classification -DataGenerator -

Pawut Jingjit
3 min readOct 7, 2020

Data Augment ไม่ว่าจะเอียงยังไง ก็เป็นแมวตัวเดียวกันนะ Credit : jugsi.blogspost

หลายๆคนคงจะมีปัญหาเวลาจะนำ Data Image เข้าสู่ Jupyter Notebook โดยเฉพาะเพื่อนๆที่กำลังทำการบ้าน ‘ Super Ai Image Classification’ อยู่ แต่เพื่อนๆจะบอกลาปัญหาเอา Data เข้า Model ไปได้เลย เมื่อเพื่อนๆรู้จัก ‘สิ่งนั้น’

Image Data Generator คืออะไร

โดยปกติที่เราต้องทำ Image Classification เราต้องทำหลายขั้นตอนมาก ไม่ว่าจะเป็น Re-Scale( แปลงRGBจาก 0–255 เป็น 0–1 ) , Train-Valid-Test Split , Data Augment , หรือจะเป็นแปลง Image to Numpy ซึ่งขั้นตอนเหล่าจะหมดไป เมื่อเราใช้ ‘Image Data Generator’

ขั้นตอนที่ 0 จัด Directory

ใครไม่อยากจัดเอง สามารถดึงจากDrive ของเจ้าของบทความได้เลย https://drive.google.com/drive/folders/1jqUCJMide7swP9Uc9zck2gJl6PA_8BVr?usp=sharing

เราจะสามารถกำหนด Label ของรูปภาพที่มาจาก Image Data Generator จาก Directory Name ในภาพ รูปที่มาจาก train/0 จะมี Label 0 และ train/1 จะมี Label 1

ขั้นตอนที่ 1 Init ImageDataGen

ดู Param เพิ่มเติมได้ที่ https://keras.io/api/preprocessing/image/

ส่วนที่สำคัญคือการ Re-Scale เพราะโมเดลส่วนใหญ่ต้องใช้ RGB ในช่วง 0–1 เท่านั้น โดยเราสามารถเพิ่มเติม Data Augment ได้ตอนที่ Init อย่างในตัวอย่างนี้ ใช้ Data Augment เป็นกลับภาพซ้าย - ขวา

Data Augment จะเป็นการปรับภาพเบื้องต้นเพื่อลด overfitting แมวน้ำหันหน้าซ้ายกับแมวน้ำหันหน้าขวาก็เป็นแมวน้ำฉันใด โมเดลก็ควรจะรู้ว่าแมวน้ำทั้งสองเป็นแมวน้ำเหมือนกัน ฉันนั้น

สำหรับใครที่จะไม่อยากรู้อะไร อยากจับเข้าโมเดลอย่างเดียวเลย สามารถใช้หา preprocessing_function จาก Model เช่น xception.preprocess_input จะได้ไม่ต้องทำ rescale , resize

โดย validation_split จะเป็นการบอกว่า จะแบ่ง train-valid เป็นอัตราส่วนเท่าไหร่

ขั้นตอนที่ 2 train-valid split

Path ต้องตรงเป้ะๆนะ , ดูรายละเอียดแต่ละ Param ได้ที่ https://keras.io/api/preprocessing/image/

Data Gen สามารถใช้งานได้หลายแบบ แต่ที่จะใช้ในที่นี้ คือ flow_from_directory ซึ่งก็คือ การดึงภาพจาก Directory มา Feed เข้าโมเดลนั่นเอง น่าสนใจตรงสามารถใช้ Param subset = training เพื่อบอกว่าเป็น trainset ได้เลย (แบ่งอัตราส่วนตั้งแต่ ขั้นตอนที่ 1 )

หลังจากนี้ก็สามารถนำ train-it เข้า Model ได้แล้ว แต่ถ้าจบบทความที่ตรงนี้ มันคงจะสั้นไปหน่อย จึงแถมวิธีการ Transfer Learning ให้เพื่อนๆที่ตามในคาบไม่ทัน

แต่เจ้าของบทความก็ล่อไปท้ายตารางอะนะ จึงได้แต่สอนวิธีการสร้าง Model ได้อย่างเดียว

ถ้าถามว่า ทำไมใช้ Model ตัวนี้ คือดู https://keras.io/api/applications/ แล้วคะแนนเยอะดีเฉยๆ

คำถามว่า มีโมเดลไหนให้ใช้มั้ง ให้ดูที่ https://keras.io/api/applications/ แต่บางทีอาจจะอัพเดทช้าหน่อย ซึ่ง Code นี้ ใครอ่านแล้วลืมๆ แนะนำให้ย้อนไปดูที่ อ. สอนอีกซักครั้ง จะเข้าใจอย่างแน่นอน

ที่น่าสนใจคือ line 6,7 เป็นการ Freeze Model ไม่ให้เปลี่ยนค่า weigh ในโมเดล

เพราะโมเดล Dept + กว่า เราไม่สามารถ train ใหม่ได้ด้วยข้อมูลแค่ 2000 ตัวแน่นอน ส่วนใครอยากจะ next level play ให้เทรนด์เฉพาะ 5–6 Layer ท้าย ก็สามารถลองได้ หรืออาจจะเติม Dense Layer ข้างหลัง InceptionResNet ก็สามารถทำได้เช่นกัน

ก่อนจะจบบทความ อยากจะเพิ่มเติมซักนิดว่า อันนี้แบ่ง train , valid set เพื่อทดสอบเท่านั้น เวลาที่จะส่งจริงๆ ให้ fit ด้วย ข้อมูลทั้งหมดนะ

แล้วก็ ใครเทรนด์ในเครื่อง accuracy 95% + ทั้ง train , valid แต่ส่งจริงได้ 80 คะแนนนี่ จะบอกว่า โจทย์นี้ใช้ f1_score มาตรวจนะ

https://colab.research.google.com/drive/1Y7jLr_u_UHp4xjVaeKQZN68DeyG_4v2H?usp=sharing <<<< เผื่อใครไม่อยากพิมพ์ตาม

— ของแถม Model Training —

หลายคนอาจจะเจอปัญหาเทรนด์ยังไงก็ไม่ผ่าน Base Line ซักที เลยอยากจะนำเสนอวิธีที่เจ้าของบทความใช้

แต่ใครเอาไปใช้ตามแล้วบอกว่า เจ้าของบทความขายฝันก็ไม่ได้นะ เพราะทำวิธีนี้ก็ไม่ได้แบบอยู่แรงก์บนนๆหรอกนะ

  1. เปลี่ยน Loss Function
ใครเจอ Accuracy 95%+ แต่ส่งไปได้ 80 ต้องเริ่มจากตรงนี้เลย

ถ้าเป็นไปได้ เราควรจะใช้ Loss Function เดียวกับที่โจทย์ใช้ แต่ไม่เสมอไป บางครั้งโจทย์ที่วัดผลด้วย MAE ถ้าสามารถใช้ MSE จะทำผลงานได้ดีกว่า

ถ้าไม่อยากเขียนเอง สามารถใช้อันเดียวกับเจ้าของบทความได้เลย

ถ้าไม่ใช้ อย่างน้อยๆก็แนะนำให้ดู f1 ของ Val Set ก็ยังโอเคร

2. เติม Dense ต่อจาก Transfer Model 1 Layer

โดยมาตรฐาน ถ้าเราใช้ Class ที่ไม่เหมือนกับ Class ของ Transfer Model เราควรต่อ Dense Layer ข้างหลัง Transfer Model ส่วนขนาด อาจจะเป็น 32–1024 ได้ทั้งหมด (แต่มีทริคง่ายๆว่า ถ้าเยอะเกิน Model จะ Overfit กับ Train Set ก็ลด Dense ลง)

3. Ensemble Model

ถึงแม้นอยู่คนเดียวจะอ่อนแอ แต่ถ้าอยู่กับพวกพ้องละก็ เราจะสามารถแข็งแกร่งขึ้นได้

ประโยคนี้ ไม่ใช่แค่ในวงการ Anime แม้แต่วงการ ML เองก็เป็นความจริง ถ้ายังจำกันได้ Random Forest ที่ทำผลงานได้ดีมาตลอด(ก่อนเข้ายุค XGBOOST กับสารพัด Boost ที่ออกมาแข่ง ) ก็ใช้หลักการนี้

โดย Random Forest เป็นการรวมกันของ decision tree จำนวน 100–1,000 ต้น จาก decision tree ที่น่าจะเป็นอัลกอลิทึมท้ายๆที่เราเลือกใช้ กลายเป็น Random Forest ที่สร้างผลงานให้ผู้ใช้ตั้งมากมาย

กลับเข้าหัวข้อ หลักการของ Ensemble นั้นตรงไปตรงมามาก โดยมาตรฐานคือ เอาผลลัพท์ของโมเดลมากกว่า 1 โมเดลมารวมกัน โดยการรวมกัน อาจจะใช้ ‘การเฉลี่ย’ (Mean Props) หรือการโหวต (Voting) ก็ได้

สมมุติ Model A,B,C,D,E ทำนาย 0,1,0,1,0 ตามอันดับ เนื่องจากประเทศ Ensemble Model เป็นประชาธิปไตย 99.99% ประเทศ EM จึงตอบ 0 จากการ Vote ชนะ (3–2)

มีข้อแนะนำเพิ่มว่า ถ้าเลือกได้ ไม่ต้องทำตาม Anime Concept ที่เอาตัวประกอบมากองๆรวมกัน เอา Model ที่ทำผลงานได้ดีๆมารวมกันจะได้ผลลัพท์ดีกว่า (จะดีมาก ถ้า Model นั้นเป็นคนละ Model กัน แต่ก็ยังเห็นคน Ensemble ResNet 5 รุ่น ประกอบเป็น Resnet+ บ่อยๆ)

ส่วนใครไม่มีเวลา หรือไม่อยากทำแล้ว สามารถดึง Submission ที่เคยส่งไปแล้วมาทำ Ensemble ได้เลย น่าจะเจอเศษคะแนนหลังตู้เย็นซัก 1 คะแนน

Sign up to discover human stories that deepen your understanding of the world.

Free

Distraction-free reading. No ads.

Organize your knowledge with lists and highlights.

Tell your story. Find your audience.

Membership

Read member-only stories

Support writers you read most

Earn money for your writing

Listen to audio narrations

Read offline with the Medium app

Responses (1)

Write a response

colab เข้าไม่ได้ครับ