Super Ai Image Classification -DataGenerator -

หลายๆคนคงจะมีปัญหาเวลาจะนำ 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

เราจะสามารถกำหนด Label ของรูปภาพที่มาจาก Image Data Generator จาก Directory Name ในภาพ รูปที่มาจาก train/0 จะมี Label 0 และ train/1 จะมี Label 1
ขั้นตอนที่ 1 Init ImageDataGen
ส่วนที่สำคัญคือการ 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
Data Gen สามารถใช้งานได้หลายแบบ แต่ที่จะใช้ในที่นี้ คือ flow_from_directory ซึ่งก็คือ การดึงภาพจาก Directory มา Feed เข้าโมเดลนั่นเอง น่าสนใจตรงสามารถใช้ Param subset = training เพื่อบอกว่าเป็น trainset ได้เลย (แบ่งอัตราส่วนตั้งแต่ ขั้นตอนที่ 1 )
หลังจากนี้ก็สามารถนำ train-it เข้า Model ได้แล้ว แต่ถ้าจบบทความที่ตรงนี้ มันคงจะสั้นไปหน่อย จึงแถมวิธีการ Transfer Learning ให้เพื่อนๆที่ตามในคาบไม่ทัน
แต่เจ้าของบทความก็ล่อไปท้ายตารางอะนะ จึงได้แต่สอนวิธีการสร้าง Model ได้อย่างเดียว
คำถามว่า มีโมเดลไหนให้ใช้มั้ง ให้ดูที่ 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 ซักที เลยอยากจะนำเสนอวิธีที่เจ้าของบทความใช้
แต่ใครเอาไปใช้ตามแล้วบอกว่า เจ้าของบทความขายฝันก็ไม่ได้นะ เพราะทำวิธีนี้ก็ไม่ได้แบบอยู่แรงก์บนนๆหรอกนะ
- เปลี่ยน Loss Function

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