0Pricing
R Academy · บทเรียน

การสร้างโมเดลแบบลำดับ

ซ้อนเลเยอร์ Dense ใช้ฟังก์ชันกระตุ้น และคอมไพล์ด้วยฟังก์ชันสูญเสียกับตัวเพิ่มประสิทธิภาพ

การสร้างโมเดลแบบลำดับ เป็นบทเรียน R Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน R Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

โมเดลแบบลำดับ

โมเดลแบบลำดับคือการเรียงชั้นต่าง ๆ ต่อกันเป็นสายเชิงเส้น โดยแต่ละชั้นมีเทนเซอร์อินพุตหนึ่งรายการและเทนเซอร์เอาต์พุตหนึ่งรายการพอดี นี่เป็นประเภทโมเดล Keras ที่ง่ายที่สุด และครอบคลุมกรณีใช้งานจริงส่วนใหญ่ ได้แก่ ตัวจำแนกแบบป้อนไปข้างหน้า โมเดลถดถอย และ CNN/RNN พื้นฐาน

library(keras)

# An empty sequential model
model <- keras_model_sequential()
print(model)

# Or specify the input shape upfront
model <- keras_model_sequential(input_shape = c(20))
print(model)

layer_dense() — ชั้นเชื่อมต่อเต็มรูปแบบ

layer_dense(units, activation) เพิ่มชั้นเชื่อมต่อเต็มรูปแบบ (ชั้นหนาแน่น) ซึ่งเซลล์ประสาทอินพุตทุกตัวเชื่อมต่อกับเซลล์ประสาทเอาต์พุตทุกตัว อาร์กิวเมนต์ units กำหนดมิติของเอาต์พุต ส่วน activation ใช้ฟังก์ชันไม่เชิงเส้น โดย 'relu' เป็นตัวเลือกมาตรฐานสำหรับชั้นซ่อน

library(keras)

model <- keras_model_sequential(input_shape = c(30)) |>
  layer_dense(units = 128, activation = 'relu') |>
  layer_dense(units = 64,  activation = 'relu') |>
  layer_dense(units = 1,   activation = 'sigmoid')

# Print architecture
summary(model)

ฟังก์ชันกระตุ้นของชั้นเอาต์พุต

ฟังก์ชันกระตุ้นของชั้นสุดท้ายขึ้นอยู่กับงาน:

  • 'sigmoid': การจำแนกแบบสองกลุ่ม (ส่งออกความน่าจะเป็น 0–1)
  • 'softmax': การจำแนกหลายกลุ่ม (ส่งออกความน่าจะเป็นที่รวมกันได้ 1)
  • 'linear' หรือไม่ใช้ฟังก์ชันกระตุ้น: การถดถอย (ส่งออกผลการคาดการณ์ที่เป็นค่าจริง)
# Binary classification
binary_model <- keras_model_sequential(input_shape = c(20)) |>
  layer_dense(64, activation = 'relu') |>
  layer_dense(1,  activation = 'sigmoid')   # P(class=1)

# Multi-class (10 classes)
multi_model <- keras_model_sequential(input_shape = c(20)) |>
  layer_dense(64,  activation = 'relu') |>
  layer_dense(10,  activation = 'softmax')  # P per class

# Regression
reg_model <- keras_model_sequential(input_shape = c(20)) |>
  layer_dense(64, activation = 'relu') |>
  layer_dense(1,  activation = 'linear')   # raw value

compile() — ค่าเสียหาย ตัวเพิ่มประสิทธิภาพ และตัวชี้วัด

compile(loss, optimizer, metrics) กำหนดค่ากระบวนการเรียนรู้ ชุดค่าที่ใช้บ่อยมีดังนี้:

  • สองกลุ่ม: loss = 'binary_crossentropy', metrics = 'accuracy'
  • หลายกลุ่ม: loss = 'categorical_crossentropy'
  • การถดถอย: loss = 'mse', metrics = 'mae'
model |> compile(
  loss      = 'binary_crossentropy',
  optimizer = optimizer_adam(learning_rate = 0.001),
  metrics   = c('accuracy')
)

# Check configuration
model$loss
model$optimizer$get_config()

optimizer_adam()

Adam (การประมาณโมเมนต์แบบปรับตัว) เป็นตัวเพิ่มประสิทธิภาพเริ่มต้นสำหรับงานการเรียนรู้เชิงลึกส่วนใหญ่ โดยปรับอัตราการเรียนรู้แยกตามพารามิเตอร์ด้วยค่าประมาณโมเมนต์อันดับหนึ่งและอันดับสองของเกรเดียนต์ อัตราการเรียนรู้เริ่มต้นที่ 0.001 เป็นจุดเริ่มต้นที่ดีสำหรับปัญหาส่วนใหญ่

# Adam with default settings
model |> compile(
  optimizer = 'adam',
  loss = 'binary_crossentropy',
  metrics = 'accuracy'
)

# Customised Adam
model |> compile(
  optimizer = optimizer_adam(
    learning_rate = 0.0005,
    beta_1  = 0.9,
    beta_2  = 0.999,
    epsilon = 1e-7
  ),
  loss    = 'binary_crossentropy',
  metrics = 'accuracy'
)

fit() — การฝึกโมเดล

fit(model, x, y, epochs, batch_size, validation_split) ใช้ฝึกโมเดล แต่ละ รอบการฝึกคือการประมวลผลข้อมูลฝึกครบหนึ่งรอบ ส่วน ขนาดกลุ่มข้อมูลกำหนดจำนวนตัวอย่างที่ประมวลผลก่อนปรับปรุงน้ำหนักแต่ละครั้ง ฟังก์ชันนี้ส่งคืนออบเจ็กต์ประวัติการฝึก

# Prepare example data
x_train <- matrix(rnorm(1000 * 20), nrow = 1000)
y_train <- sample(c(0, 1), 1000, replace = TRUE)

history <- model |> fit(
  x         = x_train,
  y         = y_train,
  epochs    = 20,
  batch_size = 32,
  validation_split = 0.2,  # reserve 20% for validation
  verbose   = 1
)

plot(history)

การทำให้ชั้นเป็นปกติ — Dropout

layer_dropout(rate) สุ่มกำหนดหน่วยอินพุตสัดส่วน rate ให้มีค่าเป็น 0 ระหว่างการฝึก วิธีนี้ป้องกันไม่ให้เซลล์ประสาทปรับตัวร่วมกันอย่างใกล้ชิดเกินไป จึงทำหน้าที่เป็นตัวทำให้เป็นปกติที่มีประสิทธิภาพ Dropout จะทำงานเฉพาะระหว่างการฝึก ไม่ทำงานระหว่างการอนุมาน

model <- keras_model_sequential(input_shape = c(784)) |>
  layer_dense(512, activation = 'relu') |>
  layer_dropout(rate = 0.4) |>
  layer_dense(256, activation = 'relu') |>
  layer_dropout(rate = 0.3) |>
  layer_dense(10,  activation = 'softmax')

summary(model)

การทำให้การถ่วงน้ำหนักแบบ L1 และ L2 เป็นปกติ

ทำให้ชั้นแต่ละชั้นเป็นปกติโดยใช้ kernel_regularizer เพื่อปรับโทษน้ำหนักขนาดใหญ่ L2 (ridge) ปรับโทษผลรวมของกำลังสองของน้ำหนัก ส่วน L1 (lasso) ปรับโทษค่าสัมบูรณ์และทำให้เกิดความเบาบาง ทั้งสองแบบใช้งานได้ผ่าน regularizer_l2() และ regularizer_l1()

model <- keras_model_sequential(input_shape = c(100)) |>
  layer_dense(
    units = 64,
    activation = 'relu',
    kernel_regularizer = regularizer_l2(l = 0.01)
  ) |>
  layer_dense(
    units = 32,
    activation = 'relu',
    kernel_regularizer = regularizer_l1_l2(l1 = 1e-4, l2 = 1e-3)
  ) |>
  layer_dense(1, activation = 'sigmoid')

summary(model)

การทำให้เป็นปกติแบบกลุ่มข้อมูล

layer_batch_normalization() ทำให้ค่าการกระตุ้นจากชั้นก่อนหน้าเป็นมาตรฐานสำหรับแต่ละกลุ่มข้อมูลย่อย วิธีนี้ช่วยให้การฝึกมีเสถียรภาพ อนุญาตให้ใช้อัตราการเรียนรู้ที่สูงขึ้น และทำหน้าที่เป็นตัวทำให้เป็นปกติในระดับหนึ่ง วางฟังก์ชันนี้หลัง layer_dense() และก่อนฟังก์ชันกระตุ้น หรือวางหลังฟังก์ชันกระตุ้นก็ได้ ทั้งสองรูปแบบมีการใช้งานจริง

model <- keras_model_sequential(input_shape = c(100)) |>
  layer_dense(256, use_bias = FALSE) |>
  layer_batch_normalization() |>
  layer_activation('relu') |>
  layer_dense(128, use_bias = FALSE) |>
  layer_batch_normalization() |>
  layer_activation('relu') |>
  layer_dense(1, activation = 'sigmoid')

summary(model)

evaluate() และ predict()

evaluate(model, x_test, y_test) คำนวณค่าความสูญเสียและเมทริกซ์วัดผลจากข้อมูลทดสอบ ส่วน predict(model, x_new) สร้างผลการพยากรณ์ดิบ ซึ่งเป็นค่าความน่าจะเป็นสำหรับการจำแนกประเภท ทั้งสองฟังก์ชันรับเมทริกซ์ตัวเลขและคืนค่าในรูปแบบที่สอดคล้องกับค่าของ R

x_test <- matrix(rnorm(200 * 20), nrow = 200)
y_test <- sample(c(0, 1), 200, replace = TRUE)

# Evaluate on test set
test_metrics <- model |> evaluate(x_test, y_test, verbose = 0)
cat('Test Loss:', test_metrics['loss'])
cat('Test Accuracy:', test_metrics['accuracy'])

# Generate predictions
prob_preds <- model |> predict(x_test)
class_preds <- ifelse(prob_preds > 0.5, 1, 0)
table(class_preds, y_test)

การบันทึกและโหลดโมเดล

บันทึกโมเดลที่คอมไพล์และฝึกแล้วด้วย save_model_tf(model, 'path') (รูปแบบ TF SavedModel ซึ่งแนะนำให้ใช้) หรือ save_model_hdf5(model, 'model.h5') โหลดโมเดลกลับด้วย load_model_tf() หรือ load_model_hdf5() โมเดลที่โหลดกลับมาจะยังคงการตั้งค่าการคอมไพล์ไว้ และสามารถใช้พยากรณ์หรือฝึกต่อได้ทันที

# Save in TensorFlow SavedModel format (recommended)
save_model_tf(model, '/tmp/my_dense_model')

# Reload
loaded <- load_model_tf('/tmp/my_dense_model')

# Confirm predictions match
new_preds <- loaded |> predict(x_test)
all.equal(prob_preds, new_preds)  # TRUE

ตรวจสอบความเข้าใจอย่างรวดเร็ว

เมื่อสร้างโมเดลแบบลำดับสำหรับปัญหาการจำแนกประเภท 5 กลุ่ม เลเยอร์เอาต์พุตควรใช้ฟังก์ชันการกระตุ้นใด และควรมีจำนวนหน่วยเท่าใด

ทบทวนโมเดลแบบลำดับ

ประเด็นสำคัญจากบทการสร้างโมเดลแบบลำดับ:

  • keras_model_sequential() สร้างการเรียงซ้อนของเลเยอร์แบบเส้นตรง
  • layer_dense(units, activation) คือเลเยอร์เชื่อมต่อเต็มรูปแบบหลัก
  • การกระตุ้นเอาต์พุต: 'sigmoid' (สองกลุ่ม), 'softmax' (หลายกลุ่ม), 'linear' (การถดถอย)
  • compile(loss, optimizer, metrics) กำหนดค่ากระบวนการเรียนรู้
  • fit(model, x, y, epochs, batch_size, validation_split) ใช้ฝึกโมเดล
  • การทำให้เป็นปกติ: layer_dropout(rate), regularizer_l2(), layer_batch_normalization()
  • บันทึกด้วย save_model_tf() และโหลดด้วย load_model_tf()
library(keras)

model <- keras_model_sequential(input_shape = c(30)) |>
  layer_dense(128, activation = 'relu') |>
  layer_dropout(0.4) |>
  layer_dense(64, activation = 'relu') |>
  layer_dropout(0.3) |>
  layer_dense(1, activation = 'sigmoid')

model |> compile(
  optimizer = optimizer_adam(0.001),
  loss      = 'binary_crossentropy',
  metrics   = 'accuracy'
)

history <- model |> fit(
  x_train, y_train,
  epochs = 30, batch_size = 64,
  validation_split = 0.2, verbose = 0
)
plot(history)

คำถามที่พบบ่อย

บทเรียน “การสร้างโมเดลแบบลำดับ” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การสร้างโมเดลแบบลำดับ” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส R Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส R Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การสร้างโมเดลแบบลำดับ”

ซ้อนเลเยอร์ Dense ใช้ฟังก์ชันกระตุ้น และคอมไพล์ด้วยฟังก์ชันสูญเสียกับตัวเพิ่มประสิทธิภาพ คุณปฏิบัติ R Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน R Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน R Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “การสร้างโมเดลแบบลำดับ” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน R Academy นี้ได้ไหม

ได้ บทเรียน R Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. การตั้งค่า Keras และ TensorFlow ใน R
  2. การสร้างโมเดลแบบลำดับ
  3. พื้นฐานโครงข่ายประสาทเทียมแบบคอนโวลูชัน
  4. การฝึก การตรวจสอบ และการป้องกันการเรียนรู้เกิน
← กลับไปที่ R Academy