🎯 Mục tiêu bài học
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!
🚀 Transfer Learning là gì?
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ừ đầu | Transfer Learning |
|---|---|
| Cần hàng triệu ảnh | Chỉ cần vài trăm ảnh |
| Train hàng tuần | Train vài phút |
| Cần GPU mạnh | Laptop cũng OK |
| Kết quả không chắc | Kết quả tốt ngay |
Pretrained Models phổ biến
| Model | Size | Accuracy (ImageNet) | Khi nào dùng |
|---|---|---|---|
| MobileNet | ~4MB | 70% | Mobile, edge devices |
| ResNet50 | ~98MB | 76% | Cân bằng tốc độ/độ chính xác |
| EfficientNet | ~29MB | 84% | Accuracy cao nhất |
Checkpoint
Bạn đã hiểu Transfer Learning là gì?
🔧 Feature Extraction vs Fine-tuning
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ì?
1Feature Extraction Fine-tuning2Data ít (dưới 1000) ✅ Dùng này ❌ Dễ overfit3Data vừa (1000-10k) ✅ Bắt đầu bằng này ✅ Sau đó fine-tune4Data nhiều (trên 10k) ⚠️ Có thể bỏ qua ✅ Nên dùngMinh họa
So sánh hai phương pháp Transfer Learning
Checkpoint
Bạn đã phân biệt được 2 chiến lược?
🖼️ Data Augmentation
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ĩa | Keras Layer |
|---|---|---|
| Flip | Lật ngang | RandomFlip("horizontal") |
| Rotation | Xoay | RandomRotation(0.1) |
| Zoom | Phóng to/thu nhỏ | RandomZoom(0.1) |
| Brightness | Đổi độ sáng | RandomBrightness(0.1) |
Code đơn giản
1import tensorflow as tf2from tensorflow.keras import layers34# Data Augmentation layer5data_augmentation = tf.keras.Sequential([6 layers.RandomFlip("horizontal"),7 layers.RandomRotation(0.1),8 layers.RandomZoom(0.1),9])1011# Demo: 1 ảnh → 4 ảnh khác nhau12import matplotlib.pyplot as plt1314# Tạo ảnh giả15image = tf.random.uniform((1, 224, 224, 3), 0, 255)1617plt.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?
💻 Xây dựng Image Classifier
Bước 1: Load Data
1import tensorflow as tf2from tensorflow import keras3from tensorflow.keras import layers45# Load data từ thư mục6# 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=4214)1516val_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=4223)2425class_names = train_ds.class_names26print(f"Classes: {class_names}")1Classes: ['cat', 'dog']Bước 2: Load Pretrained Model
1from tensorflow.keras.applications import ResNet5023# Load ResNet50 (không lấy lớp classification cuối)4base_model = ResNet50(5 weights='imagenet', # Pretrained trên ImageNet6 include_top=False, # Bỏ lớp cuối7 input_shape=(224, 224, 3)8)910# FREEZE base model!11base_model.trainable = False1213print(f"Base model layers: {len(base_model.layers)}")14print(f"Trainable: {base_model.trainable}")1Base model layers: 1752Trainable: FalseBước 3: Xây Model Hoàn Chỉnh
1# Data augmentation2data_augmentation = keras.Sequential([3 layers.RandomFlip("horizontal"),4 layers.RandomRotation(0.1),5 layers.RandomZoom(0.1),6])78# Xây model9model = keras.Sequential([10 # Input11 layers.Input(shape=(224, 224, 3)),12 13 # Augmentation (tự động tắt khi inference)14 data_augmentation,15 16 # Preprocessing cho ResNet17 layers.Rescaling(1./127.5, offset=-1),18 19 # Pretrained base20 base_model,21 22 # Custom classifier23 layers.GlobalAveragePooling2D(),24 layers.Dropout(0.5),25 layers.Dense(len(class_names), activation='softmax')26])2728model.summary()Bước 4: Train
1# Compile2model.compile(3 optimizer='adam',4 loss='sparse_categorical_crossentropy',5 metrics=['accuracy']6)78# Train9history = 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?
🔧 Fine-tuning (Nâng cao)
Khi nào Fine-tune?
Chỉ Fine-tune khi:
- Feature Extraction đã xong
- Có đủ data (>1000 ảnh)
- Muốn tăng thêm accuracy
Code Fine-tuning
1# Sau khi train Feature Extraction xong...23# Bước 1: Unfreeze top layers của base model4base_model.trainable = True56# Chỉ train 30 layers cuối7for layer in base_model.layers[:-30]:8 layer.trainable = False910# 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ơn13 loss='sparse_categorical_crossentropy',14 metrics=['accuracy']15)1617# Bước 3: Train tiếp18history_fine = model.fit(19 train_ds,20 validation_data=val_ds,21 epochs=522)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?
🎯 Tổng kết Module CNN
Kiến thức đã học
| Bài | Nội dung |
|---|---|
| 06 | Convolution, Filter, Feature Detection |
| 07 | Pooling, CNN Architecture |
| 08 | VGG, ResNet, EfficientNet |
| 09 | Transfer Learning, Fine-tuning |
Công thức thành công
1Transfer Learning + Data Augmentation = 🚀 Kết quả tốt với ít data!Template nhanh
1# 🚀 QUICK START: Image Classification2from tensorflow import keras3from tensorflow.keras.applications import ResNet5045# 1. Load data6train_ds = keras.utils.image_dataset_from_directory(7 'data/train', image_size=(224, 224))89# 2. Build model10base = ResNet50(weights='imagenet', include_top=False,11 input_shape=(224, 224, 3))12base.trainable = False # FREEZE!1314model = keras.Sequential([15 base,16 keras.layers.GlobalAveragePooling2D(),17 keras.layers.Dense(len(train_ds.class_names), activation='softmax')18])1920# 3. Train21model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', 22 metrics=['accuracy'])23model.fit(train_ds, epochs=10)2425# 4. Save26model.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!
