CNN คืออะไร?
Convolutional Neural Network (CNN) เป็นเทคนิคใน Deep Learning (DL) ที่ใช้ในการประมวลผลข้อมูลที่มีโครงสร้าง เช่น ภาพและวิดีโอ โดย CNN เป็นส่วนหนึ่งของ Machine Learning ที่เน้นการเรียนรู้จากข้อมูลเพื่อทำนายผลหรือจำแนกประเภท ในขณะที่ Deep Learning เป็นสาขาหนึ่งของ Machine Learning ที่ใช้โครงข่ายประสาทเทียม (Artificial Neural Networks) ที่มีหลายชั้น (Deep Networks) เพื่อเรียนรู้และทำความเข้าใจลักษณะข้อมูลที่ซับซ้อน โดย CNN ถูกพัฒนาเพื่อทำให้การประมวลผลภาพและข้อมูลเชิงพื้นที่มีประสิทธิภาพมากขึ้น
- Convolution Layer ใช้ฟิลเตอร์หรือเคอร์เนล (kernel) ขนาดเล็กเลื่อนผ่านข้อมูลอินพุต (เช่น ภาพ) เพื่อคำนวณคุณสมบัติ (features) ที่สำคัญ ชั้นนี้จะช่วยลดความซับซ้อนของการประมวลผลภาพโดยไม่สูญเสียข้อมูลสำคัญ จะได้ผลลัพธ์ที่ได้เรียกว่า "feature map"
- Pooling Layer เป็นชั้นที่ทำหน้าที่ในการลดขนาดของข้อมูล (down-sampling) เพื่อทำให้การคำนวณมีประสิทธิภาพมากขึ้น และลดการ overfitting ตัวอย่างของ pooling ได้แก่ Max Pooling (เลือกค่ามากที่สุดในพื้นที่เล็กๆ) และ Average Pooling (ค่าเฉลี่ย)
- Activation Function จะใช้ฟังก์ชันไม่เชิงเส้น เช่น ReLU (Rectified Linear Unit) เพื่อเพิ่มความสามารถในการเรียนรู้ลักษณะเชิงซับซ้อน
- Fully Connected Layer เป็นชั้นที่เชื่อมต่อโครงข่ายทั้งหมด ใช้สำหรับการจำแนกประเภท (classification) หรือการคาดการณ์ผลลัพธ์
- Dropout Layer ใช้ลด overfitting โดยสุ่มปิดบางหน่วยในโครงข่ายระหว่างการฝึก
ตัวอย่างการใช้ CNN
import tensorflow as tf
from tensorflow.keras.datasets import mnist
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, Flatten, Dense, Dropout
from tensorflow.keras.optimizers import Adam
# โหลดข้อมูล MNIST
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train = x_train.reshape(x_train.shape[0], 28, 28, 1)
x_test = x_test.reshape(x_test.shape[0], 28, 28, 1)
# แปลงค่าพิกเซลให้อยู่ในช่วง [0, 1]
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
# จำนวนคลาส (ใน MNIST มี 10 คลาส คือ 0-9)
num_classes = 10
# แปลง Label
y_train = to_categorical(y_train, num_classes)
y_test = to_categorical(y_test, num_classes)
# Build and compile model
model = Sequential()
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(x_train.shape[1], x_train.shape[2])))
model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(100, activation='relu'))
model.add(Dense(10, activation='softmax', name='Output'))
model.compile(optimizer=Adam(learning_rate=0.001),
loss='categorical_crossentropy', # ใช้ categorical_crossentropy แทน sparse_categorical_crossentropy เพราะ label เป็น one-hot
metrics=['accuracy'])
model.fit(x_train, y_train, epochs=10, batch_size=200, validation_data=(x_test, y_test))
score = model.evaluate(x_test, y_test)
print('Test loss:', score[0])
print('Test accuracy:', score[1])
การทำงานของ CNN
- รับข้อมูลอินพุตเข้ามาในโมเดล เช่น ภาพขนาด 28x28 พิกเซล
- ผ่านชั้นคอนโวลูชัน เพื่อทำการสกัดคุณสมบัติที่สำคัญ เช่น รูปแบบ หรือโครงสร้างเฉพาะในภาพ
- ลดขนาดข้อมูลผ่านการ Pooling เพื่อรักษาคุณสมบัติสำคัญ
- แปลงข้อมูลเพื่อเชื่อมกันทุกชั้นโดย Fully Connected Layer
- โมเดลสำหรับนำไปทำนาย
สรุป
CNN ใช้ในการรู้จำภาพ เช่น แยกประเภทวัตถุและตรวจจับใบหน้าได้อย่างแม่นยำ
เหมาะสำหรับการตรวจจับวัตถุและระบุพื้นที่สำคัญในภาพ เช่น การวิเคราะห์ภาพทางการแพทย์
สามารถใช้งานในระบบขับเคลื่อนอัตโนมัติ เช่น ตรวจจับสัญญาณจราจรในรถยนต์ไร้คนขับ
มีประสิทธิภาพในงานแยกส่วนภาพและสร้างภาพใหม่ เช่น งานศิลปะดิจิทัล เป็นเครื่องมือสำคัญในงานด้าน Computer Vision และการประมวลผลภาพขั้นสูง สามารถศึกษาตัวอย่างการจำแนกรูปภาพได้ที่ การจำแนกภาพเบื้องต้นด้วย Keras และหากสามารถศึกษาการเลือกโมเดลได้จากการเลือกโมเดลที่เหมาะสมสำหรับการจำแนกรูปภาพ 2 คลาส