การฝึกอบรม Image Classifier ด้วย Deep learning [Tensorflow]
Deep Learning คือวิธีการเรียนรู้แบบอัตโนมัติด้วยการ เลียนแบบการทำงานของโครงข่ายประสาทของมนุษย์ (Neurons) โดยนำระบบโครงข่ายประสาท (Neural Network) มาซ้อนกัน หลายชั้น (Layer) และทำการเรียนรู้ข้อมูลตัวอย่าง ซึ่งข้อมูล ดังกล่าวจะถูกนำไปใช้ในการตรวจจับรูปแบบ (Pattern) หรือจัด หมวดหมู่ข้อมูล (Classify the Data)
คงต้องยอมรับว่า หากจะเล่น Deep learning ในชั่วโมงนี้ ก็ต้องใช้
1) TensorFlow
2) Convolutional Neural Networks
ในบทความนี้ ใช้ ทั้งคู่ นี้เพื่อ ทำการฝึกอบรม Image Classifier
TensorFlow เป็นไลบรารีที่ใช้ Python ซึ่งมีฟังก์ชันการทำงานประเภทต่างๆสำหรับการใช้งานโมเดล Deep Learning ตามที่กล่าวไว้ก่อนหน้านี้คำว่า TensorFlow ประกอบด้วยสองคำ — Tensor และคำว่า Flow โดย คำว่า tensor หมายถึงการแสดงข้อมูลเป็นอาร์เรย์หลายมิติในขณะที่การไหลของคำหมายถึงชุดของการดำเนินการที่ดำเนินการกับเทนเซอร์
ด้วยเหตุที่ชุดข้อมูลเป็นรูปภาพจริง จำนวนมาก ถึง 60000 ภาพในชุดข้อมูล เราจึงเลือกใช้ Convolutional Neural Networks เป็นเทคนิคการเรียนรู้เชิงลึกที่เป็นที่นิยมสำหรับงานการจดจำภาพในปัจจุบัน เช่นเดียวกับเทคนิคการเรียนรู้เชิงลึก Convolutional Neural Networks ขึ้นอยู่กับขนาดและคุณภาพของข้อมูลการฝึกอบรม
ในวันนี้ เราจะใช้ Tensor flow เพื่อทำการ ทำนายรูปภาพ ฏโดยใช้ ชุดข้อมูลCIFAR10 ที่ประกอบด้วย รูป จำนวน 10 ประเภท คือ {‘เครื่องบิน’, ‘รถยนต์’, ‘นก’, ‘แมว’, ‘กวาง’, ‘สุนัข’, ‘กบ’, ‘ม้า’, ‘เรือ’, ‘รถบรรทุก’}
โดยทุกภาพใน CIFAR-10 มีขนาด 3x32x32 กล่าวคือภาพสี 3 ช่องขนาด 32 × 32 พิกเซล และ ชุดข้อมูลที่ใช้คือ CIFAR10 ซึ่งสามารถหา download ได้จากhttps://www.kaggle.com/c/cifar-10
หมายเหตุ เพื่อให้ง่ายในบทความนี้ จะใช้ datasets ที่มากับ tensorflow นะครับ
การพัฒนาโปรแกรม จะทำตามขั้นตอน ต่อไปนี้ตามลำดับ:
1. กำลังโหลดและ Normalizing CIFAR10
2. กำหนด Convolution Neural Network
3. กำหนดฟังก์ชันการสูญเสีย
4. ฝึกอบรมเครือข่ายเกี่ยวกับข้อมูลการฝึกอบรม
5. ทดสอบเครือข่ายกับข้อมูลการทดสอบ
ขั้นตอนที่ 1: กำลังโหลดและ Normalizing CIFAR10
จากภาพที่ 1: เราจะเห็นว่า จากการอ่านรูปภาพเข้ามา เราลองมาดูว่า มีจำนวนเท่าไร บ้าง โดยใช้คำสั่ง shape บน x_train และ y_train
พบว่า มิติข้อมูลที่โหลดข้อมูลมา Train set มี 60,000 รายการ ขนาด 28 x 28 Pixel ส่วน Test set มี 10,000 รายการ
จะเห็นได้ว่า x_train มีทั้งหมด 50000 รูป ภาพสี 3 ช่องขนาด 32 × 32 พิกเซล ต่อรูป และ y_train มีทั้งหมด 50000 รูป และ 1 คอลัมน์ คือ ประเภท (label) ว่าเป็น รูปใด ใน 10 ประเภท
จากนั้นมาลองดูตัวอย่างข้อมูลกัน เนื่องจากเรารู้ว่าข้อมูลเป็นภาพ เราสามารถใช้ Method .imshow
ของ matplotlib แสดงภาพได้ทันที:
ภาพแรกของ ชุดข้อมูล จะเห็นว่า ภาพคือ กบ (frog) จากนั้นทำการ เปลี่ยน Label ทั้ง 10 ประเภท ด้วย one hot encodering (บรรยายไว้บทก่อนหน้า) โดยใช้ to_categical และทำการ Scale ข้อมูลโดยใช้วิธี Normalise ซึ่งก็คือการหารข้อมูลทุกรายการด้วย Range ของค่าความสว่างของแต่ละ Pixel นั่นก็คือ 255
ขั้นตอนที่ 2: กำหนด Convolution Neural Network
สังเกต Layer สุดท้าย คือ Dense(10, activation='softmax')
ใช้ Softmax activation function ซึ่งทำให้โมเดลสามารถ Output แบบ Multiclass ได้ โดยเราต้องกำหนดจำนวน Neuron เท่ากับจำนวน Class ที่เป็นไปได้ ซึ่งก็คือ 10 นั่นเอง
ขั้นตอนที่ 3: กำหนดฟังก์ชันการสูญเสีย
เราจะต้องกำหนดฟังก์ชันการสูญเสีย เราจะใช้ categorical_crossentropy โดยพื้นฐานแล้วการสูญเสียข้ามเอนโทรปีคือค่าความน่าจะเป็นที่อยู่ระหว่าง 0–1 รูปแบบที่สมบูรณ์แบบจะขาดทุนข้ามเอนโทรปีของ0 แต่มันอาจจะเกิดขึ้นเพื่อว่ามูลค่าที่คาดว่าอาจจะเป็น 0.5
หลังจาก compile โมเดล จากนั้นทำการ fit ได้เลย
ขั้นตอนที่ 4: ทดสอบเครือข่ายกับข้อมูลการทดสอบ
ลองมาดูประสิทธิภาพของโมเดล.
แม้ว่า ประสิทธิภาพของโมเดล จะได้เพียง 65% เพราะ เรารันเพียง 10 รอบ (epochs) ก็ถือว่าเพียงพอในการสาธิต
ผลการรันคือ
ในขั้นตอนนี้เราจะทดสอบเครือข่ายกับข้อมูลการทดสอบ คือด้วย ข้อมูลทดสอบชื่อ cat.4015.jpg
ลองมาทดสอบโดยการ upload ภาพนี้เข้ามา
และทำการ resize ให้มีขนาด 32 × 32 พิกเซล ด้วย Method ชื่อ resize(new_image,(32,32,3))
มาดูผลการทำนาย ด้วย เมธอท model.predict
ผลชี้ชัดว่า แมว [index=3] ได้ ความน่าจะเป็น(%) สูงที่สุดในทั้งหมด 10 ประเภท คือ 67.4% ชนิดขาดลอย โดยที่สองคือ 13%
จะเห็นได้ว่า Convolutional Neural Networks มีความแม่นยำสูงและเป็นที่นิยมมากในขณะนี้ ในวงการ Deep learning
หมายเหตุ สามารถหาขอ Source Code และภาพทดสอบ ที่ chetneti@rsu.ac.th