ทดสอบ deep learning ง่ายๆ ใน 10 บรรทัด

เชื่อว่าหลายๆ คนคงจะเคยได้ยินคำว่า Deep learning กันมาสักพักแล้วใช่ไหมครับ แต่ทราบหรือไม่ครับว่าทำไมมันถึงถูกเรียกว่า deep learning ทำไม เขาไม่เรียก machine learning เหมือนเดิม

วิธีการเขียนโปรแกรมของ Machine learning แบบเดิมนั้น ต้องใช้ "คน" เป็นผู้สร้างฟีเจอร์ หรือเลือกวิธีในการสร้างฟีเจอร์ ขึ้นมาเอง แล้วค่อยเอาไปเทรนระบบ ซึ่งปัญหามันอยู่ตรงนี้แหละครับ

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

1+1 = 2
2+1 = 4
2+3 = 5
3+4 = 6

แล้วเราก็ถามเด็กว่า 4+2 = ? เด็กๆ ก็อาจจะตอบได้ แต่ก็ไม่มีใครมั่นใจว่าตัวเองนั้นตอบถูกรึเปล่า นั่นก็เป็นเพราะว่าข้อมูลที่เราใช้สอนระบบ มีข้อมูลที่ผิดพลาด หรือข้อมูลที่ไม่จำเป็นรวมอยู่ในนั้นด้วย

ดังนั้นเพื่อให้ระบบแสดงประสิทธิภาพออกมาได้ดีที่สุด จึงจำเป็นต้องมีการพัฒนาวิธีการ "สะกัดฟีเจอร์" ซึ่งวิธีการที่ดีที่สุดก็คือ ให้โปรแกรมนั่นแหละสะกัดฟีเจอร์ออกมาจากภาพเอง ด้วยวิธีการแบบนี้จึงเป็นที่มาของคำว่า Deep learning นั่นเองครับ และทำให้วิธีการแบบ Deep learning มีความถูกต้องแม่นยำอย่างมาก จึงเป็นที่นิยมอย่างรวดเร็ว

ข้อเสียเพียงอย่างเดียวของ Deep learning ก็คือ ต้องใช้ทรัพยากรเครื่องสูงมาก และใช้เวลาในการเทรน ดังนั้นคอมพิวเตอร์ทั่วไป อาจไม่สามารถเทรนระบบ deep learning ขึ้นมาเพื่อใช้เองได้ หรือไม่ก็ต้องใช้เวลาหลายวันกว่าจะเทรนระบบสักอันขึ้นมาได้

แต่ถ้าเราใช้ MATLAB ก็หมดห่วงปัญหานี้ไปได้เลยครับ เพราะว่า MATLAB มี Deep learning ที่เทรนเสร็จแล้วให้เราติดตั้งและเรียกใช้งานได้เลยทันที ซึ่งก็มีอยู่หลายตัว แต่ในตัวอย่างนี้ผมจะใช้ deep learning ที่ชื่อว่า Alexnet เป็นตัวอย่างในการเขียนโปรแกรมนะครับ

Alexnet เป็นนิวรอลเน็ตเวิร์คประเภท convolutional neural network (CNN) ซึ่งถูกเทรนเสร็จเรียบร้อยแล้ว โดยใช้ข้อมูลรูปภาพของวัตถุ 1,000 ชนิด จำนวนมากกว่า 1 ล้านรูป ในการเทรน ดังนั้นเราจึงสามารถเรียกใช้งานได้เลย โดยไม่ต้องเทรนระบบเอง งั้นเรามาลองเขียนโปรแกรมดูกันเลยครับว่ามันจะใช้งานได้ง่ายแค่ไหน และแม่นยำแค่ไหน

*หมายเหตุ ใช้ได้กับ MATLAB 2016b ขึ้นไปเท่านั้น

clc;clear;close all;

net = alexnet;
pic = imread('coffemug.png');
im = imresize(pic,[227 227]);
lb = classify(net,im);
imshow(pic);
title(char(lb))

โค้ดมีแค่นี้เองครับ สั้นมากเลยใช่ไหม ฮ่าๆๆๆ
ถ้าใครกดรันแล้วเจอข้อความแจ้งเตือน error แบบนี้แสดงว่ายังไม่ได้ติดตั้ง Alexnet นะครับ ให้คลิกที่ Add-On Explorer แล้วก็ติดตั้งได้เลยครับ จากนั้นปิด MATLAB แล้วก็เปิดใหม่ก็ใช้งานได้แล้วครับ


"Error using alexnet (line 51)
alexnet requires the Deep Learning Toolbox Model for AlexNet Network support package. To install this support package, use the
Add-On Explorer."

ลองมาดูกันครับว่าผลจะเป็นยังไงบ้าง (จะใช้รูปอะไรทดสอบก็ได้นะครับ ผมก็ไม่รู้เหมือนกันว่าวัตถุ 1000 ชนิดที่เขาใช้เทรนมีอะไรบ้าง)

อันแรก โปรแกรมตอบว่า ถ้วยกาแฟ ถือว่าถูกต้องนะครับ

รูปต่อมา โปรแกรมตอบว่า "Mixing bowl" แปลว่า "ชามผสม" อนุโลมให้ถูกละกันครับ 5555+

รูปนี้โปรแกรมตอบว่า "โลชั่น" ครับ มันก็เหมือนอยู่นะ ฮ่าๆๆ

ส่วนรูปนี้โปรแกรมตอบว่า "honeycomb" แปลว่า "รังผึ้ง" ครับ สีมันก็คล้ายๆ รังผึ้งอยู่นะผมว่า

ส่วนดอกทานตะวัน ก็กลายเป็นดอก "เดซี่" ไปซะงั้น แต่ต่างประเทศก็คงไม่มีดอกทานตะวันละมั้ง

ส่วนแมวที่บ้านผม ถูกมองว่าเป็นตัว "วอมแบต" ไปซะแล้วครับ ฮ่าๆๆ
ส่วนหน้าตาของเจ้าวอมแบตก็เป็นแบบนี้ครับ

ต่อไปมาทดสอบกับรถดูบ้างครับ

รูปนี้โปรแกรมตอบว่า มินิแวน ผมนึกว่ามันจะตอบแค่ว่า car เฉยๆ ซะอีก แต่นี่ถึงกับบอกประเภทรถได้ด้วย

ส่วนรูปนี้โปรแกรมตอบว่า "Liner" แปลว่า "เรือเดินสมุทร" 

สรุปนะครับ ถึงแม้ว่าจะไม่แม่นยำในระดับที่สายตามนุษย์มอง แต่ตัว cnn AlexNet ตัวนี้ ก็ถือว่าตอบได้แม่นยำ และใกล้เคียงมากครับ

ความเห็น

โพสต์ยอดนิยมจากบล็อกนี้

การแก้สมการ Differential ด้วย MATLAB

ว่าด้วยเรื่องของ ERROR

การหาค่าเฉลี่ยโดยไม่ต้องเก็บค่า