พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน
เพิ่มเลเยอร์ Conv2D และ MaxPooling สำหรับงานจำแนกภาพ
พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้ CNN กับรูปภาพ
โครงข่ายแบบหนาแน่นปฏิบัติต่อพิกเซลแต่ละพิกเซลอย่างเป็นอิสระ ทำให้สูญเสียความสัมพันธ์เชิงตำแหน่ง โครงข่ายประสาทแบบคอนโวลูชัน (CNN) ใช้ตัวกรองที่เรียนรู้ได้เลื่อนไปบนอินพุต เพื่อตรวจจับรูปแบบเฉพาะที่ เช่น ขอบ พื้นผิว และรูปร่าง โดยไม่ขึ้นกับตำแหน่ง คุณสมบัติที่ไม่แปรผันต่อการเลื่อนนี้ (translation invariance) รวมถึงการใช้พารามิเตอร์ร่วมกัน ทำให้ CNN เป็นมาตรฐานหลักสำหรับข้อมูลรูปภาพ
library(keras)
# Images are 3D tensors: (height, width, channels)
# MNIST: (28, 28, 1) — grayscale
# CIFAR-10: (32, 32, 3) — RGB
# Reshape flat vectors into image tensors
mnist <- dataset_mnist()
x_train <- array_reshape(mnist$train$x / 255, c(-1, 28, 28, 1))
y_train <- to_categorical(mnist$train$y, 10)
cat('Input shape:', dim(x_train))layer_conv_2d() — เลเยอร์หลัก
layer_conv_2d(filters, kernel_size, activation) ใช้เคอร์เนล 2 มิติที่เรียนรู้ได้จำนวน filters และมีขนาด kernel_size กับอินพุต ตัวกรองแต่ละตัวจะเรียนรู้เพื่อตรวจจับรูปแบบเชิงตำแหน่งประเภทหนึ่ง เอาต์พุตจะมีรูปร่างเป็น (height, width, filters)
library(keras)
# First conv layer: 32 filters of 3x3
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(
filters = 32,
kernel_size = c(3, 3),
activation = 'relu',
padding = 'same' # keep spatial dimensions
)
summary(model) # output: (None, 28, 28, 32)layer_max_pooling_2d()
layer_max_pooling_2d(pool_size) ลดมิติเชิงตำแหน่งด้วยการเลือกค่าสูงสุดในแต่ละหน้าต่างพูลลิง วิธีนี้มีประโยชน์สองประการ คือ ลดจำนวนพารามิเตอร์ในเลเยอร์ถัดไป และเพิ่มความไม่แปรผันต่อการเลื่อนในระดับหนึ่ง (การเลื่อนเล็กน้อยจะไม่ทำให้เอาต์พุตเปลี่ยนไปมาก)
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, kernel_size = c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(pool_size = c(2, 2))
summary(model)
# After pooling: (None, 13, 13, 32)
# Spatial dims halved, channel count preservedการเรียงซ้อนเลเยอร์คอนโวลูชัน
CNN ที่มีความลึกมากจะเรียงซ้อนบล็อก Conv+Pool หลายบล็อก เลเยอร์ช่วงแรกตรวจจับคุณลักษณะระดับพื้นฐาน (ขอบและความชัน) ส่วนเลเยอร์ที่ลึกขึ้นจะนำคุณลักษณะเหล่านี้มารวมกันเป็นคุณลักษณะระดับสูง (รูปร่างและวัตถุ) เลเยอร์ Conv แต่ละชั้นจะเพิ่มจำนวนตัวกรองเพื่อชดเชยกับมิติเชิงตำแหน่งที่เล็กลง
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |> # 16x16
layer_conv_2d(64, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |> # 8x8
layer_conv_2d(128, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) # 4x4
summary(model)layer_flatten()
layer_flatten() แปลงเอาต์พุต 3 มิติของบล็อกคอนโวลูชันสุดท้าย (height, width, filters) ให้เป็นเวกเตอร์ 1 มิติ นี่คือส่วนเชื่อมระหว่างแกนหลักสำหรับสกัดคุณลักษณะ (เลเยอร์คอนโวลูชัน) กับส่วนหัวสำหรับจำแนกประเภท (เลเยอร์หนาแน่น)
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_conv_2d(64, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |> # 3D -> 1D vector
layer_dense(128, activation = 'relu') |>
layer_dense(10, activation = 'softmax')
summary(model)layer_dropout() ใน CNN
ใน CNN โดยทั่วไปจะใช้ดรอปเอาต์หลังเลเยอร์แฟลตเทนและเลเยอร์หนาแน่น ไม่ใช่ภายในบล็อกคอนโวลูชัน (ซึ่งมักเลือกใช้ spatial dropout layer_spatial_dropout_2d() แทน) อัตรา 0.25–0.5 หลังเลเยอร์หนาแน่นแรกเป็นค่าที่ใช้กันทั่วไป
model <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_conv_2d(64, c(3, 3), activation = 'relu') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |>
layer_dense(128, activation = 'relu') |>
layer_dropout(rate = 0.5) |> # regularise the classifier head
layer_dense(10, activation = 'softmax')
summary(model)การคอมไพล์และฝึก CNN
คอมไพล์และฝึก CNN ได้เช่นเดียวกับโครงข่ายแบบหนาแน่น สำหรับการจำแนกประเภทหลายกลุ่มที่ใช้ป้ายกำกับแบบ one-hot ให้ใช้ 'categorical_crossentropy' ส่วนป้ายกำกับจำนวนเต็มให้ใช้ 'sparse_categorical_crossentropy' CNN มักได้ผลดีจากอัตราการเรียนรู้ที่ต่ำกว่าโครงข่ายแบบหนาแน่นเล็กน้อย
model |> compile(
optimizer = optimizer_adam(learning_rate = 0.0005),
loss = 'categorical_crossentropy',
metrics = c('accuracy')
)
history <- model |> fit(
x = x_train,
y = y_train,
epochs = 10,
batch_size = 64,
validation_split = 0.1,
verbose = 1
)
plot(history)การเพิ่มความหลากหลายให้ข้อมูล
การฝึก CNN ด้วยชุดข้อมูลขนาดเล็กมักทำให้เกิดการเรียนรู้เกินพอดี การเพิ่มความหลากหลายให้ข้อมูล จะขยายชุดฝึกแบบเทียมด้วยการใช้การแปลงแบบสุ่ม (การพลิก การหมุน และการซูม) ระหว่างการฝึก ใน keras3 ให้ใช้ layer_random_flip() และ layer_random_rotation() เป็นเลเยอร์ก่อนการประมวลผลภายในโมเดล
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
# Data augmentation layers (only active during training)
layer_random_flip('horizontal') |>
layer_random_rotation(factor = 0.1) |>
layer_random_zoom(height_factor = 0.1) |>
# CNN backbone
layer_conv_2d(32, c(3, 3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2, 2)) |>
layer_flatten() |>
layer_dense(10, activation = 'softmax')
summary(model)การประเมิน CNN
evaluate(model, x_test, y_test) คืนค่าความสูญเสียและความแม่นยำจากข้อมูลทดสอบ หากต้องการวิเคราะห์เชิงลึก ให้ใช้ predict() เพื่อรับค่าความน่าจะเป็นของแต่ละกลุ่ม จากนั้นสร้างเมทริกซ์ความสับสนหรือคำนวณคะแนน F1 แยกตามกลุ่ม เพื่อทำความเข้าใจว่าโมเดลมีปัญหากับส่วนใด
# Evaluate on test set
test_scores <- model |> evaluate(x_test, y_test, verbose = 0)
cat('Test accuracy:', test_scores['accuracy'])
# Get predicted classes
prob_matrix <- model |> predict(x_test)
pred_classes <- max.col(prob_matrix) - 1 # 0-indexed
true_classes <- mnist$test$y
# Confusion matrix
table(Predicted = pred_classes, True = true_classes)แนวคิดการเรียนรู้แบบถ่ายโอน
การฝึก CNN ตั้งแต่ต้นต้องใช้ชุดข้อมูลขนาดใหญ่ การเรียนรู้แบบถ่ายโอน นำเลเยอร์สกัดคุณลักษณะที่ฝึกไว้ล่วงหน้าด้วย ImageNet (เช่น VGG, ResNet และ MobileNet) กลับมาใช้ใหม่ และฝึกเฉพาะส่วนหัวสำหรับจำแนกประเภทที่กำหนดเอง ใน keras ให้โหลดฐานโมเดลที่ฝึกไว้ล่วงหน้าด้วย application_mobilenet_v2() แล้วตรึงเลเยอร์ของฐานโมเดลไว้
# Load MobileNetV2 pretrained on ImageNet
base_model <- application_mobilenet_v2(
weights = 'imagenet',
include_top = FALSE, # remove original classifier head
input_shape = c(224, 224, 3)
)
# Freeze pretrained weights
base_model$trainable <- FALSE
# Add custom classifier head
model <- keras_model(
inputs = base_model$input,
outputs = base_model$output |>
layer_global_average_pooling_2d() |>
layer_dense(128, activation = 'relu') |>
layer_dense(5, activation = 'softmax')
)การเติมขอบและสไตรด์ของ Conv2D
อาร์กิวเมนต์สำคัญสองรายการของ layer_conv_2d: padding = 'same' เติมศูนย์รอบอินพุต เพื่อให้เอาต์พุตมีขนาดเชิงตำแหน่งเท่ากับอินพุต ส่วน padding = 'valid' (ค่าเริ่มต้น) จะลดมิติลง kernel_size - 1 strides = c(2,2) ใช้แทน max pooling โดยเลื่อนตัวกรองทีละ 2 หน่วย
# 'same' padding: output = input size
conv_same <- layer_conv_2d(filters = 32, kernel_size = c(3, 3),
padding = 'same')
# Strided convolution instead of pooling
conv_strided <- layer_conv_2d(filters = 64, kernel_size = c(3, 3),
strides = c(2, 2), # halves spatial dims
padding = 'same')
# Model using strides instead of max pooling
model2 <- keras_model_sequential(input_shape = c(28, 28, 1)) |>
layer_conv_2d(32, c(3,3), strides = c(2,2), activation = 'relu',
padding = 'same') |>
layer_conv_2d(64, c(3,3), strides = c(2,2), activation = 'relu',
padding = 'same') |>
layer_flatten() |>
layer_dense(10, activation = 'softmax')
summary(model2)ตรวจสอบความเข้าใจอย่างรวดเร็ว
จุดประสงค์หลักของ layer_max_pooling_2d(pool_size = c(2, 2)) ใน CNN คืออะไร
ทบทวน CNN
ประเด็นสำคัญจากบทพื้นฐานโครงข่ายประสาทแบบคอนโวลูชัน:
- CNN ใช้ขอบเขตการรับรู้เฉพาะที่และการใช้พารามิเตอร์ร่วมกัน เพื่อประมวลผลรูปภาพอย่างมีประสิทธิภาพ
layer_conv_2d(filters, kernel_size, activation)สกัดคุณลักษณะเชิงตำแหน่งlayer_max_pooling_2d(pool_size)ลดขนาดตัวอย่างและเพิ่มความไม่แปรผันต่อการเลื่อนlayer_flatten()เชื่อมแกนหลักคอนโวลูชันเข้ากับส่วนหัวตัวจำแนกแบบหนาแน่นlayer_dropout(rate)ช่วยทำให้ส่วนหัวสำหรับจำแนกประเภทเป็นปกติ- เลเยอร์เพิ่มความหลากหลายให้ข้อมูล (
layer_random_flip()และอื่น ๆ) ช่วยลดการเรียนรู้เกินพอดี - การเรียนรู้แบบถ่ายโอนด้วยแกนหลักที่ฝึกไว้ล่วงหน้าเป็นแนวทางที่เหมาะสมสำหรับชุดข้อมูลขนาดเล็ก
# Standard CNN architecture for image classification
model <- keras_model_sequential(input_shape = c(32, 32, 3)) |>
layer_conv_2d(32, c(3,3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2,2)) |>
layer_conv_2d(64, c(3,3), activation = 'relu', padding = 'same') |>
layer_max_pooling_2d(c(2,2)) |>
layer_conv_2d(128, c(3,3), activation = 'relu', padding = 'same') |>
layer_flatten() |>
layer_dense(256, activation = 'relu') |>
layer_dropout(0.5) |>
layer_dense(num_classes, activation = 'softmax')
model |> compile('adam', 'categorical_crossentropy', 'accuracy')
summary(model)เรียนรู้ R ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 43
- บทเรียน
- 159
คำถามที่พบบ่อย
บทเรียน “พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน”
เพิ่มเลเยอร์ Conv2D และ MaxPooling สำหรับงานจำแนกภาพ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม
ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การตั้งค่า Keras และ TensorFlow ใน R
- การสร้างโมเดลแบบลำดับ
- พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน
- การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน