# 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!