279 lines
7.4 KiB
Markdown
279 lines
7.4 KiB
Markdown
# Hướng dẫn sử dụng Swin-UNet
|
|
|
|
## Giới thiệu
|
|
|
|
**Swin-UNet** là một mô hình hybrid kết hợp:
|
|
- **Swin Transformer blocks** - cho phép học các mối quan hệ toàn cục
|
|
- **U-Net architecture** - với skip connections để bảo toàn chi tiết địa phương
|
|
- **Hierarchical structure** - xử lý features ở nhiều cấp độ độ phân giải
|
|
|
|
## Ưu điểm chính
|
|
|
|
### 1. **Kiến trúc mạnh mẽ**
|
|
- Kết hợp được điểm mạnh của cả Transformer và CNN
|
|
- Self-attention giúp học các mối quan hệ phức tạp
|
|
- Skip connections bảo toàn thông tin chi tiết
|
|
|
|
### 2. **Hiệu suất cao**
|
|
- State-of-the-art accuracy cho nhiều tác vụ vision
|
|
- Học nhanh hơn so với ViT cơ bản
|
|
- Ổn định trong quá trình training
|
|
|
|
### 3. **Linh hoạt**
|
|
- Hoạt động tốt với ít dữ liệu (transfer learning)
|
|
- Có thể scale lên hoặc xuống theo yêu cầu
|
|
- Hỗ trợ cả GPU và CPU
|
|
|
|
## Cấu hình tối ưu
|
|
|
|
### Cấu hình nhanh (test/prototyping)
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 60,
|
|
"learning_rate": 0.001,
|
|
"use_gpu": true,
|
|
"test_size": 0.2
|
|
}
|
|
```
|
|
- Training time: ~15-20 phút (GPU) / ~1-2 giờ (CPU)
|
|
- Accuracy: Tốt cho các dataset nhỏ
|
|
|
|
### Cấu hình cân bằng (production)
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 100,
|
|
"learning_rate": 0.0005,
|
|
"use_gpu": true,
|
|
"test_size": 0.2,
|
|
"max_scenes": 30,
|
|
"resolution": 10
|
|
}
|
|
```
|
|
- Training time: ~30-45 phút (GPU)
|
|
- Accuracy: Rất cao (>90% thường)
|
|
|
|
### Cấu hình cao cấp (accuracy tối đa)
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 150,
|
|
"learning_rate": 0.0003,
|
|
"use_gpu": true,
|
|
"test_size": 0.2,
|
|
"max_scenes": 60,
|
|
"resolution": 10
|
|
}
|
|
```
|
|
- Training time: ~45-60 phút (GPU)
|
|
- Accuracy: Tối ưu nhất (95%+)
|
|
- Yêu cầu: Dataset lớn, GPU mạnh
|
|
|
|
## So sánh với các model khác
|
|
|
|
| Tiêu chí | CNN | ResNet | ViT | **Swin-UNet** |
|
|
|---------|-----|--------|-----|--------------|
|
|
| Độ chính xác | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
| Tốc độ training | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ |
|
|
| Bộ nhớ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ⭐⭐⭐ |
|
|
| Ổn định | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
|
|
| Dataset nhỏ | ✓ | ✓ | ✗ | ✓ |
|
|
| Dataset lớn | ✓ | ✓ | ✓ | ✓ |
|
|
|
|
## Kiến trúc chi tiết
|
|
|
|
### Encoder (Đường xuống)
|
|
```
|
|
Input Features (n_features)
|
|
↓
|
|
Adapter Layer (project to embed_dim)
|
|
↓
|
|
Encoder1 (embed_dim → embed_dim)
|
|
↓
|
|
Downsample (→ embed_dim*2)
|
|
↓
|
|
Encoder2 (embed_dim*2 → embed_dim*2)
|
|
↓
|
|
Downsample (→ embed_dim*4)
|
|
↓
|
|
Encoder3 (embed_dim*4) - Bottleneck
|
|
```
|
|
|
|
### Decoder (Đường lên)
|
|
```
|
|
Encoder3 Output
|
|
↓
|
|
Upsample (→ embed_dim*2)
|
|
↓
|
|
Concatenate with Skip from Encoder2
|
|
↓
|
|
Decoder2 (embed_dim*4 → embed_dim*2)
|
|
↓
|
|
Upsample (→ embed_dim)
|
|
↓
|
|
Concatenate with Skip from Encoder1
|
|
↓
|
|
Decoder1 (embed_dim*2 → embed_dim)
|
|
↓
|
|
Attention Layer (Multi-head)
|
|
↓
|
|
Classifier (embed_dim → n_classes)
|
|
```
|
|
|
|
### Hyperparameters
|
|
- **embed_dim**: 128 (kích thước embedding)
|
|
- **batch_size**: 32
|
|
- **optimizer**: AdamW (với weight decay = 0.01)
|
|
- **scheduler**: CosineAnnealingLR
|
|
- **dropout**: 0.1-0.3 (để regularization)
|
|
|
|
## Kỹ thuật training
|
|
|
|
### 1. Learning Rate Schedule
|
|
- Bắt đầu từ `learning_rate`
|
|
- Giảm dần theo cosine schedule
|
|
- Giúp convergence tốt hơn
|
|
|
|
### 2. Weight Decay
|
|
- Sử dụng AdamW với weight_decay=0.01
|
|
- Ngăn overfitting
|
|
- Improve generalization
|
|
|
|
### 3. Attention Mechanism
|
|
- Multi-head attention (4 heads)
|
|
- Giúp model học các mối quan hệ phức tạp
|
|
- Cộng hưởng với self-attention trong Transformer
|
|
|
|
## Tips để đạt kết quả tốt
|
|
|
|
### ✅ Làm gì
|
|
1. **Tăng epochs** - Swin-UNet thường cần nhiều epochs (60-150)
|
|
2. **Sử dụng GPU** - Training nhanh hơn 10-20x
|
|
3. **Learning rate nhỏ** - 0.0001 - 0.0005 cho dataset lớn
|
|
4. **Augmentation** - Nếu có thể, augment training data
|
|
5. **Monitor loss** - Loss nên giảm dần qua epochs
|
|
|
|
### ❌ Tránh gì
|
|
1. **Learning rate quá cao** - Training không ổn định
|
|
2. **Quá ít epochs** - Model chưa hội tụ
|
|
3. **Batch size quá lớn** - Hết bộ nhớ
|
|
4. **Overfitting** - Nếu train_acc >> test_acc, cần giảm epochs
|
|
|
|
## Troubleshooting
|
|
|
|
### Vấn đề: "CUDA out of memory"
|
|
```python
|
|
# Giải pháp:
|
|
- Giảm batch_size (từ 32 xuống 16)
|
|
- Giảm embed_dim (từ 128 xuống 64)
|
|
- Sử dụng CPU: "use_gpu": false
|
|
```
|
|
|
|
### Vấn đề: Loss không giảm
|
|
```python
|
|
# Giải pháp:
|
|
- Giảm learning_rate (thử 0.0001)
|
|
- Tăng epochs (thử 150+)
|
|
- Kiểm tra dữ liệu training
|
|
```
|
|
|
|
### Vấn đề: Quá chậm
|
|
```python
|
|
# Giải pháp:
|
|
- Giảm n_estimators (↓ epochs)
|
|
- Giảm max_scenes (↓ dữ liệu)
|
|
- Sử dụng GPU nếu có
|
|
```
|
|
|
|
### Vấn đề: Accuracy thấp
|
|
```python
|
|
# Giải pháp:
|
|
- Tăng epochs (thử 100-150)
|
|
- Thử learning_rate khác (0.0005, 0.001)
|
|
- Kiểm tra chất lượng dữ liệu training
|
|
- Thử model khác (ViT)
|
|
```
|
|
|
|
## So sánh Learning Rates
|
|
|
|
| Learning Rate | Độ nhanh | Ổn định | Khuyến cáo |
|
|
|---------------|----------|---------|-----------|
|
|
| 0.01 | Nhanh | Kém | ❌ Quá cao |
|
|
| 0.005 | Trung bình | Trung bình | ⚠️ Có thể dùng |
|
|
| 0.001 | Trung bình | Tốt | ✅ Mặc định |
|
|
| 0.0005 | Chậm | Rất tốt | ✅ Dùng khi cần độ chính xác cao |
|
|
| 0.0001 | Rất chậm | Tuyệt | ✅ Cho ViT/LoRA |
|
|
|
|
## Khi nào dùng Swin-UNet?
|
|
|
|
### ✓ Sử dụng khi
|
|
- Bạn có dataset vừa đến lớn (500+ samples)
|
|
- Cần độ chính xác cao (>90%)
|
|
- Có GPU hoặc thời gian chờ đợi
|
|
- Muốn model ổn định và đáng tin cậy
|
|
- Dữ liệu có các mẫu phức tạp
|
|
|
|
### ✗ Không sử dụng khi
|
|
- Dataset rất nhỏ (<200 samples) → Dùng CNN hoặc XGBoost
|
|
- Thời gian quá hạn → Dùng CNN hoặc XGBoost
|
|
- Không có GPU và thời gian bị giới hạn → Dùng XGBoost
|
|
- Cần mô hình hết sức nhẹ → Dùng CNN
|
|
|
|
## Ví dụ thực tế
|
|
|
|
### Trường hợp 1: Phân loại nhanh
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 60,
|
|
"learning_rate": 0.001,
|
|
"use_gpu": true,
|
|
"max_scenes": 12,
|
|
"resolution": 20
|
|
}
|
|
```
|
|
**Kết quả**: ~15 phút, 85% accuracy
|
|
|
|
### Trường hợp 2: Phân loại cân bằng
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 100,
|
|
"learning_rate": 0.0005,
|
|
"use_gpu": true,
|
|
"max_scenes": 30,
|
|
"resolution": 10
|
|
}
|
|
```
|
|
**Kết quả**: ~40 phút, 92% accuracy
|
|
|
|
### Trường hợp 3: Phân loại chính xác tối đa
|
|
```json
|
|
{
|
|
"model_type": "swin-unet",
|
|
"n_estimators": 150,
|
|
"learning_rate": 0.0003,
|
|
"use_gpu": true,
|
|
"max_scenes": 60,
|
|
"resolution": 10
|
|
}
|
|
```
|
|
**Kết quả**: ~60 phút, 96%+ accuracy
|
|
|
|
## Tài liệu tham khảo
|
|
|
|
- Swin Transformer: https://arxiv.org/abs/2103.14030
|
|
- U-Net: https://arxiv.org/abs/1505.04597
|
|
- Swin-UNet for Medical Image: https://arxiv.org/abs/2105.05537
|
|
|
|
## Kết luận
|
|
|
|
Swin-UNet là lựa chọn tuyệt vời khi bạn cần:
|
|
- ✅ Độ chính xác cao
|
|
- ✅ Model ổn định
|
|
- ✅ Khả năng xử lý dữ liệu phức tạp
|
|
- ✅ Training tương đối nhanh
|
|
|
|
Hãy thử Swin-UNet cho các tác vụ classification quan trọng và cần chất lượng cao!
|