MinAI - Về trang chủ
Lý thuyết
9/2150 phút
Đang tải...

Ứng Dụng CNN và Transfer Learning

Áp dụng CNN vào bài toán thực tế: Image Classification với Transfer Learning

0

🎯 Mục tiêu bài học

TB5 min

Sau bài này, bạn sẽ:

✅ Hiểu Transfer Learning là gì và tại sao quan trọng

✅ Biết cách Feature Extraction vs Fine-tuning

✅ Biết dùng Data Augmentation

✅ Xây dựng Image Classifier hoàn chỉnh

Transfer Learning = Bí quyết để đạt kết quả tốt với ít data!

Ôn lại bài trước

Module CNN đã học:

  • Convolution: Phát hiện features (edges, patterns)
  • Pooling: Giảm kích thước, giữ thông tin quan trọng
  • Các model nổi tiếng: VGG, ResNet, EfficientNet

Hôm nay: Áp dụng vào thực tế với Transfer Learning!

1

🚀 Transfer Learning là gì?

TB5 min

Analogy: Học lái xe

Bạn đã biết lái xe máy → Học lái ô tô sẽ dễ hơn người chưa biết gì!

Transfer Learning cũng vậy:

  • Model đã học ImageNet (1 triệu ảnh, 1000 loại)
  • Chuyển kiến thức sang task của bạn (ví dụ: phân loại chó/mèo)
  • Không cần train từ đầu!

Tại sao hiệu quả?

Train từ đầuTransfer Learning
Cần hàng triệu ảnhChỉ cần vài trăm ảnh
Train hàng tuầnTrain vài phút
Cần GPU mạnhLaptop cũng OK
Kết quả không chắcKết quả tốt ngay

Pretrained Models phổ biến

ModelSizeAccuracy (ImageNet)Khi nào dùng
MobileNet~4MB70%Mobile, edge devices
ResNet50~98MB76%Cân bằng tốc độ/độ chính xác
EfficientNet~29MB84%Accuracy cao nhất

Checkpoint

Bạn đã hiểu Transfer Learning là gì?

2

🔧 Feature Extraction vs Fine-tuning

TB5 min

Hai chiến lược

Feature Extraction: Đóng băng (freeze) pretrained model, chỉ train lớp cuối

Fine-tuning: Mở khóa (unfreeze) một số lớp, train cùng lớp cuối

Khi nào dùng gì?

Ví dụ
1Feature Extraction Fine-tuning
2Data ít (dưới 1000) ✅ Dùng này ❌ Dễ overfit
3Data vừa (1000-10k) ✅ Bắt đầu bằng này ✅ Sau đó fine-tune
4Data nhiều (trên 10k) ⚠️ Có thể bỏ qua ✅ Nên dùng

Minh họa

So sánh hai phương pháp Transfer Learning

So sánh hai phương pháp Transfer LearningFeature ExtractionConv Block 1❄️Conv Block 2❄️Conv Block 3❄️Frozen (Không train)Lớp mớiOutputNhanhData nhỏFine-tuningConv Block 1❄️Conv Block 2Conv Block 3Trainable (Train được)Lớp mớiOutputChậm hơnData lớn hơn❄️ = Frozen (Không train)✓ = Trainable (Train được)

Checkpoint

Bạn đã phân biệt được 2 chiến lược?

3

🖼️ Data Augmentation

TB5 min

Tại sao cần?

Data Augmentation = Tạo thêm data từ data có sẵn

Một ảnh → Xoay, lật, zoom, đổi màu → Nhiều ảnh mới!

Các kỹ thuật

AugmentationÝ nghĩaKeras Layer
FlipLật ngangRandomFlip("horizontal")
RotationXoayRandomRotation(0.1)
ZoomPhóng to/thu nhỏRandomZoom(0.1)
BrightnessĐổi độ sángRandomBrightness(0.1)

Code đơn giản

python.py
1import tensorflow as tf
2from tensorflow.keras import layers
3
4# Data Augmentation layer
5data_augmentation = tf.keras.Sequential([
6 layers.RandomFlip("horizontal"),
7 layers.RandomRotation(0.1),
8 layers.RandomZoom(0.1),
9])
10
11# Demo: 1 ảnh → 4 ảnh khác nhau
12import matplotlib.pyplot as plt
13
14# Tạo ảnh giả
15image = tf.random.uniform((1, 224, 224, 3), 0, 255)
16
17plt.figure(figsize=(10, 3))
18for i in range(4):
19 augmented = data_augmentation(image)
20 plt.subplot(1, 4, i+1)
21 plt.imshow(augmented[0].numpy().astype("uint8"))
22 plt.title(f"Augment {i+1}")
23 plt.axis("off")
24plt.show()

Augmentation chỉ áp dụng khi training! Inference dùng ảnh gốc.

Checkpoint

Bạn đã hiểu Data Augmentation?

4

💻 Xây dựng Image Classifier

TB5 min

Bước 1: Load Data

python.py
1import tensorflow as tf
2from tensorflow import keras
3from tensorflow.keras import layers
4
5# Load data từ thư mục
6# Cấu trúc: data/train/cat/, data/train/dog/
7train_ds = keras.utils.image_dataset_from_directory(
8 'data/train',
9 image_size=(224, 224),
10 batch_size=32,
11 validation_split=0.2,
12 subset='training',
13 seed=42
14)
15
16val_ds = keras.utils.image_dataset_from_directory(
17 'data/train',
18 image_size=(224, 224),
19 batch_size=32,
20 validation_split=0.2,
21 subset='validation',
22 seed=42
23)
24
25class_names = train_ds.class_names
26print(f"Classes: {class_names}")
Expected Output
1Classes: ['cat', 'dog']

Bước 2: Load Pretrained Model

python.py
1from tensorflow.keras.applications import ResNet50
2
3# Load ResNet50 (không lấy lớp classification cuối)
4base_model = ResNet50(
5 weights='imagenet', # Pretrained trên ImageNet
6 include_top=False, # Bỏ lớp cuối
7 input_shape=(224, 224, 3)
8)
9
10# FREEZE base model!
11base_model.trainable = False
12
13print(f"Base model layers: {len(base_model.layers)}")
14print(f"Trainable: {base_model.trainable}")
Expected Output
1Base model layers: 175
2Trainable: False

Bước 3: Xây Model Hoàn Chỉnh

python.py
1# Data augmentation
2data_augmentation = keras.Sequential([
3 layers.RandomFlip("horizontal"),
4 layers.RandomRotation(0.1),
5 layers.RandomZoom(0.1),
6])
7
8# Xây model
9model = keras.Sequential([
10 # Input
11 layers.Input(shape=(224, 224, 3)),
12
13 # Augmentation (tự động tắt khi inference)
14 data_augmentation,
15
16 # Preprocessing cho ResNet
17 layers.Rescaling(1./127.5, offset=-1),
18
19 # Pretrained base
20 base_model,
21
22 # Custom classifier
23 layers.GlobalAveragePooling2D(),
24 layers.Dropout(0.5),
25 layers.Dense(len(class_names), activation='softmax')
26])
27
28model.summary()

Bước 4: Train

python.py
1# Compile
2model.compile(
3 optimizer='adam',
4 loss='sparse_categorical_crossentropy',
5 metrics=['accuracy']
6)
7
8# Train
9history = model.fit(
10 train_ds,
11 validation_data=val_ds,
12 epochs=10,
13 callbacks=[
14 keras.callbacks.EarlyStopping(patience=3, restore_best_weights=True)
15 ]
16)

Checkpoint

Bạn đã biết xây Image Classifier?

5

🔧 Fine-tuning (Nâng cao)

TB5 min

Khi nào Fine-tune?

Chỉ Fine-tune khi:

  1. Feature Extraction đã xong
  2. Có đủ data (>1000 ảnh)
  3. Muốn tăng thêm accuracy

Code Fine-tuning

python.py
1# Sau khi train Feature Extraction xong...
2
3# Bước 1: Unfreeze top layers của base model
4base_model.trainable = True
5
6# Chỉ train 30 layers cuối
7for layer in base_model.layers[:-30]:
8 layer.trainable = False
9
10# Bước 2: Re-compile với learning rate RẤT NHỎ!
11model.compile(
12 optimizer=keras.optimizers.Adam(learning_rate=1e-5), # 100x nhỏ hơn
13 loss='sparse_categorical_crossentropy',
14 metrics=['accuracy']
15)
16
17# Bước 3: Train tiếp
18history_fine = model.fit(
19 train_ds,
20 validation_data=val_ds,
21 epochs=5
22)

Mẹo Fine-tuning:

  • Learning rate cực nhỏ (1e-5 hoặc nhỏ hơn)
  • Chỉ unfreeze top layers (layers cuối)
  • Nếu val_loss tăng → STOP ngay!

Checkpoint

Bạn đã hiểu khi nào và cách Fine-tune?

6

🎯 Tổng kết Module CNN

TB5 min

Kiến thức đã học

BàiNội dung
06Convolution, Filter, Feature Detection
07Pooling, CNN Architecture
08VGG, ResNet, EfficientNet
09Transfer Learning, Fine-tuning

Công thức thành công

Ví dụ
1Transfer Learning + Data Augmentation = 🚀 Kết quả tốt với ít data!

Template nhanh

python.py
1# 🚀 QUICK START: Image Classification
2from tensorflow import keras
3from tensorflow.keras.applications import ResNet50
4
5# 1. Load data
6train_ds = keras.utils.image_dataset_from_directory(
7 'data/train', image_size=(224, 224))
8
9# 2. Build model
10base = ResNet50(weights='imagenet', include_top=False,
11 input_shape=(224, 224, 3))
12base.trainable = False # FREEZE!
13
14model = keras.Sequential([
15 base,
16 keras.layers.GlobalAveragePooling2D(),
17 keras.layers.Dense(len(train_ds.class_names), activation='softmax')
18])
19
20# 3. Train
21model.compile(optimizer='adam', loss='sparse_categorical_crossentropy',
22 metrics=['accuracy'])
23model.fit(train_ds, epochs=10)
24
25# 4. Save
26model.save('my_classifier.keras')

Module tiếp theo

Module 3: RNN - Xử lý dữ liệu tuần tự (văn bản, chuỗi thời gian)

🎉 Hoàn thành Module CNN!

Giờ bạn có thể xây dựng Image Classifier với Transfer Learning chỉ với vài chục dòng code!