Lesson 05 · คาบเช้า + บ่าย 28 ต.ค. · ~30 นาที

CNN: Convolution, Pooling, Fully-connected

โยงกับสไลด์ DL 25–51, 53

เป้าหมายบทนี้: คำนวณขนาด output ของ conv/pooling, อธิบายหน้าที่ของ 3 ชั้น และเลือก sigmoid/softmax ให้ถูก

1Image processing: convolution คืออะไร

รูปภาพ 1 พิกเซลมี 3 channel (R, G, B) ภาพ \( 350\times449 \) จึงมี shape \( (350, 449, 3) \) ถ้านำ 1 − image จะได้ภาพ negative เฉลี่ย 3 channel ได้ gray scale (ช่วงเช้า ไม่มีไทม์สแตมป์)

สไลด์ DL 28: Basic Image Processing: image shape (350, 449, 3) และ 1 − image
สไลด์ 28ดูว่า channel สีเป็นแผ่นแยกกัน 3 แผ่น

Convolution = dot & sum ด้วยแผ่น filter (kernel) แล้วเลื่อนไล่กวาดทั้งภาพ ได้ภาพใหม่

สไลด์ DL 32: Convolution kernel และผลลัพธ์ เปลี่ยน kernel ก็ได้ผลต่างกัน
สไลด์ 32ดูว่าแต่ละ kernel ให้ภาพคนละแบบ

ปัญหาของวิชา Image Processing: คนต้องไปทดลองออกแบบแผ่น filter เอง ซึ่งไม่มีใครรู้ว่า filter แบบไหนเหมาะกับโจทย์ ("หนึ่ง kernel = สกัดหนึ่งฟีเจอร์ = มองภาพหนึ่งมุมมอง") → ให้โมเดลหาค่าใน kernel เองด้วย back-propagation → นี่คือ CNN

ค่าในแผ่น kernel เป็น weight ที่เรียนรู้จาก back-propagation จากโจทย์โดยตรง จึงเป็นฟีเจอร์ที่ เหมาะกับโจทย์ (เช่นแบ่งหมาแมว)

2ชั้นที่ 1: Convolutional layer (+ ReLU)

สไลด์ DL 39: พารามิเตอร์ของ conv layer 4 ตัว และสูตร Output size = (N + 2P − F)/S + 1
สไลด์ 39ดูสองตัวอย่างที่ได้ output 3×3

ผู้ใช้กำหนด 4 อย่าง: filter size, #filters, stride, padding

$$ \text{Output}=\frac{N+2P-F}{S}+1 $$ \( N \) = ขนาดภาพเข้า, \( F \) = ขนาด filter, \( P \) = padding, \( S \) = stride

ตัวอย่าง

ตัวอย่างในสไลด์

ภาพ \( 5\times5 \), filter \( 3\times3 \), stride 1, padding 0 → \( (5+0-3)/1+1=3 \) ภาพ \( 5\times5 \), filter \( 3\times3 \), stride 2, padding 1 → \( (5+2-3)/2+1=3 \)

ลองไล่ kernel เอง

ภาพ 5×5 กับ kernel 3×3 จากสไลด์ 37 กดทีละขั้นดู dot & sum ของแต่ละตำแหน่ง ช่องสีน้ำเงินคือบริเวณที่ kernel ทับอยู่

อาจารย์เปรียบว่า: Neural Network ที่บอกว่า "ผสมให้หน่อย 3 hidden unit" ก็เหมือนกับ "ให้สกัดฟีเจอร์ด้วย kernel 3 แผ่น"

3ชั้นที่ 2: Pooling layer

สไลด์ DL 42: Pooling layer ลดขนาด filter 2×2 stride 2
สไลด์ 42ดูว่าเลือกค่าสูงสุดในแต่ละช่อง

ภาพจริงมีพิกเซลหลายล้านค่า ถ้าสกัด 128 แผ่นโดยไม่ลดขนาด memory จะระเบิด จึงต้องมี pooling เพื่อลดขนาดภาพ Max pooling เลือกค่าเด่นสุดในแต่ละบริเวณ ภาพ \( 4\times4 \) ใช้ \( 2\times2 \) stride 2 เหลือ \( 2\times2 \) (ลดลง 4 เท่า)

พารามิเตอร์ของ pooling มี 2 ตัว คือ filter size กับ stride และ ไม่มีค่า weight ให้เรียนรู้

ลำดับที่อาจารย์ย้ำ: สกัดฟีเจอร์ (conv+ReLU) → ลดขนาด (pool) → สกัดต่อ → ลดขนาด ...

4ชั้นที่ 3: Fully-connected

สไลด์ DL 44: Flatten ผลจาก conv/pooling เป็นเวกเตอร์ x1..x4 แล้วทำนาย Yes
สไลด์ 44ดูว่าก้อนภาพสุดท้ายถูกเรียงเป็นเวกเตอร์

เมื่อเหลือภาพเล็ก ๆ หลายแผ่น (เช่น 2 แผ่น แผ่นละ \( 2\times2 \)) ให้ Flatten เรียงทุกค่าเป็นเวกเตอร์ยาว \( 2\times2\times2=8 \) ค่า นี่คือ embedding vector แล้วส่งเข้า Neural Network ปกติ (Fully-connected layer: hidden layer กี่ชั้นก็ได้) เพื่อทำนายผลลัพธ์

5เลเยอร์ผลลัพธ์ (output layer)

สไลด์ DL 46: Activation สำหรับ classification: Sigmoid (binary) และ Softmax (multi-class)
สไลด์ 46เทียบว่าใช้เมื่อไร
เงื่อนไขOutput layerผลรวม prob
2 คลาส (แมว/ไม่ใช่แมว)Sigmoid แปลง logit เป็น prob ระหว่าง 0–1ไม่ต้องรวมเป็น 1 (1 ค่า)
หลายคลาสแยกกัน (หมา/แมว/นก)Softmaxรวมเป็น 1
หลาย label พร้อมกันSigmoid อย่างละหนึ่งตัวต่อ labelไม่จำเป็นต้องรวมเป็น 1

\( \text{sigmoid}(z)=\dfrac{1}{1+e^{-z}} \) และ \( \text{softmax}_i=\dfrac{e^{z_i}}{\sum_j e^{z_j}} \)

ตัวอย่าง

Softmax ที่อาจารย์คำนวณมือ

score ของ [แมว, หมา, นก] = [2, 1, 0] \( e^2=7.389,\ e^1=2.718,\ e^0=1 \) ผลรวม 11.107 prob = [0.665, 0.245, 0.090] → ทำนาย แมว (prob สูงสุด) ผลรวม = 1

ลองขยับ score ของแต่ละคลาส ดู prob ที่เปลี่ยน ผลรวมคงเป็น 1 และ loss ของคลาสที่ถูกต้อง

sigmoid ไม่ใช่ "ค่า prob ของทุกคลาสรวมกันเป็น 1" ใช้กับ 2 คลาส ส่วน softmax ใช้กับ multi-class จริง ๆ ที่ไม่ซ้อนกัน อย่าสลับกัน

6Loss และการ back-propagation

สไลด์ DL 50: Binary Cross-Entropy, ตัวอย่าง y=1, p=0.9 ได้ L = 0.105
สไลด์ 50ดูตัวอย่างตัวเลขท้ายสไลด์

อาจารย์บอกว่าไม่ลงสูตรลึก แต่ต้องรู้ว่า: ทำนายเทียบของจริง → ได้ error → เปลี่ยนเป็น loss → loss ส่งกลับ (back-propagation) อัปเดต weight ทั้งส่วน Fully-connected และแผ่น kernel ด้วย

ตัวอย่าง

BCE

y = 1 (แมวจริง) p = 0.9 → \( L=-\ln 0.9=0.105 \) (ต่ำ ทำนายดี) ถ้า p = 0.1 → \( L=-\ln 0.1=2.30 \) (สูง ทำนายผิดมาก)

7ตัวอย่างโครงสร้างจริง: VGG

สไลด์ DL 53: VGGNet: filter 3×3 stride 1 pad 1 ร่วมกับ max pool 2×2 stride 2, ลึก 16–19 ชั้น
สไลด์ 53ดูว่าทำไมใช้ filter เล็กแต่ลึก

อาจารย์ใบ้ว่า VGG16 ต้องเขียนโค้ดต่อทีละชั้นประมาณสิบกว่าบรรทัด VGG19 ก็สิบกว่าบรรทัด แต่ปัจจุบันไม่มีใครต่อเองแล้ว ใช้ โมเดลที่ต่อไว้เสร็จ (pre-defined/pretrained) แล้วเรียกจากชื่อ (บทถัดไป)

8ลองทำ

อ่านเพิ่ม / ที่มา

ติดตรงไหน ถาม Claude ได้เลย บอกเลขบทกับเลขข้อมาด้วย