Thử đổi qua CNN

This commit is contained in:
Victor Phan
2025-11-10 22:55:42 +07:00
parent d7e3894db2
commit 08248f49ed
16 changed files with 2729 additions and 40 deletions
+334
View File
@@ -0,0 +1,334 @@
# Quick Start Guide - CNN PyTorch
## 🚀 Bắt đầu nhanh
### 1️⃣ Cài đặt (5 phút)
```bash
# Nếu chưa có PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
# Hoặc với conda
conda install pytorch torchvision torchaudio pytorch-cuda=11.8 -c pytorch -c nvidia
# Cài đặt dependencies
pip install -r requirements_pytorch.txt
```
Kiểm tra cài đặt:
```python
import torch
print(torch.cuda.is_available()) # True nếu có GPU
print(torch.__version__)
```
### 2️⃣ Huấn luyện Model (30 phút với GPU)
```bash
# Mở Jupyter notebook
jupyter notebook 04.train_CNN_PyTorch_ODC.ipynb
# Chạy tất cả cells (Kernel → Run All)
# Hoặc chạy từng cell bằng Shift+Enter
```
**Output:**
- ✅ Model được lưu: `model_train/model_cnn_pytorch.pth`
- ✅ Training history: plots in notebook
**Dự kiến kết quả:**
```
Test Accuracy: 87.45%
Test Loss: 0.3521
```
### 3️⃣ Dự đoán (15 phút với GPU)
```bash
# Mở Jupyter notebook
jupyter notebook 05.predict_CNN_PyTorch_ODC.ipynb
# Chạy tất cả cells
```
**Output:**
- ✅ Classification map: `prediction_results/classification_map_cnn_pytorch.tif`
- ✅ Bản đồ hiển thị: 8 lớp sử dụng đất
- ✅ GeoTIFF file sử dụng được với QGIS, ArcGIS, v.v.
---
## 📊 Giải thích Code
### Model Architecture (trong `new_import_ODC.py`)
```python
class CNN1D(nn.Module):
"""
Input: Time series 35 features (VH×12 + VV×12 + NDVI×12 = 24+24+12)
Output: 8 land use classes
"""
```
**3 Convolutional Blocks:**
- Block 1: 64 filters + MaxPool
- Block 2: 128 filters + MaxPool
- Block 3: 256 filters + GlobalAvgPool
**2 Fully Connected Layers:**
- Dense(256→256) + Dropout
- Dense(256→128) + Dropout
- Dense(128→8) + Softmax
### Training Loop (Notebook cell 15)
```python
cnn_model, history, scaler = train_cnn_pytorch(
X_train, X_val, X_test,
y_train, y_val, y_test,
num_classes=8,
epochs=100,
batch_size=32,
learning_rate=1e-3,
device='cuda' # hoặc 'cpu'
)
# Result:
# - cnn_model: Trained PyTorch model
# - history: Training/validation accuracy & loss
# - scaler: Fitted StandardScaler để normalize data
```
### Prediction Loop (Notebook cell 14-16)
```python
# Cell 14: Tải model
model, scaler = load_pytorch_model("model_cnn_pytorch.pth", device='cuda')
# Cell 15-16: Dự đoán
# Xử lý từng pixel bằng batch processing
# Output: Classification map (10980×10980 pixels)
```
---
## 🔧 Tùy chỉnh
### Thay đổi Epochs
```python
# Trong 04.train_CNN_PyTorch_ODC.ipynb, cell 15:
cnn_model, history, scaler = train_cnn_pytorch(
X_train, X_val, X_test, y_train, y_val, y_test,
epochs=200 # ← Từ 100 → 200 (tăng accuracy nhưng lâu hơn)
)
```
### Thay đổi Batch Size
```python
# Batch size lớn → Nhanh hơn nhưng xài nhiều GPU memory
batch_size=64 # Từ 32 → 64
# Batch size nhỏ → Chậm hơn nhưng xài ít memory
batch_size=16 # Từ 32 → 16
```
### Thay đổi Learning Rate
```python
# Learning rate cao → Nhanh hội tụ nhưng có thể bỏ qua optimum
learning_rate=5e-3
# Learning rate thấp → Chậm hội tụ nhưng ổn định hơn
learning_rate=1e-4
```
### Dùng CPU thay vì GPU
```python
# Notebook cell 2: Thay
device = 'cuda'
# Bằng
device = 'cpu'
# Note: Training sẽ chậm 10-50x
```
---
## 📈 Monitoring Training
Notebook vẽ 2 đồ thị tự động:
1. **Accuracy Plot**
- Train accuracy tăng dần
- Validation accuracy tăng nhưng có thể flatten
- Gap lớn = overfitting
2. **Loss Plot**
- Train loss giảm dần
- Validation loss giảm nhưng có thể tăng
- Gap lớn = overfitting
**Good training:**
```
Epoch 1: Train Acc: 60%, Val Acc: 55%
Epoch 50: Train Acc: 92%, Val Acc: 85%
Epoch 100: Train Acc: 95%, Val Acc: 87% ← Early stop here
```
**Overfitting:**
```
Epoch 1: Train Acc: 60%, Val Acc: 55%
Epoch 50: Train Acc: 92%, Val Acc: 80%
Epoch 100: Train Acc: 98%, Val Acc: 78% ← Training continues but val doesn't improve
```
---
## 🐛 Troubleshooting
### Problem: CUDA out of memory
**Solution 1:**
```python
# Giảm batch size
batch_size = 16 # Từ 32 → 16
```
**Solution 2:**
```python
# Dùng CPU
device = 'cpu'
```
**Solution 3:**
```python
# Clear GPU memory
torch.cuda.empty_cache()
```
### Problem: Model training quá chậm
**Nguyên nhân:** Dùng CPU
**Solution:**
```python
# Dùng GPU
device = 'cuda'
# Hoặc check CUDA:
print(torch.cuda.is_available()) # Phải True
```
### Problem: ImportError: No module named 'torch'
**Solution:**
```bash
pip install torch
```
### Problem: Classification map không hiển thị
**Solution:**
```python
# Kiểm tra file output
import os
print(os.path.exists('prediction_results/classification_map_cnn_pytorch.tif'))
# Hoặc load và kiểm tra
result = rioxarray.open_rasterio('prediction_results/classification_map_cnn_pytorch.tif')
print(result.shape)
print(result.values)
```
---
## 📂 File Structure
```
CSIROBoeingPhase5-Vietnam/
├── 04.train_CNN_PyTorch_ODC.ipynb ← Huấn luyện
├── 05.predict_CNN_PyTorch_ODC.ipynb ← Dự đoán
├── new_import_ODC.py ← Module với CNN class
├──
├── model_train/
│ ├── model_cnn_pytorch.pth ← Trained model
│ ├── model_odc.joblib ← Random Forest (existing)
│ └── model_new.joblib
├──
├── prediction_results/
│ └── classification_map_cnn_pytorch.tif ← Output map
├──
├── train/
│ └── ST_training data_updated_1130points_new.shp
├──
├── CNN_PYTORCH_README.md ← Hướng dẫn chi tiết
├── CNN_PYTORCH_SUMMARY.md ← Summary
├── COMPARISON_RF_VS_CNN.md ← So sánh
├── PYTORCH_INSTALLATION.md ← Cài đặt
└── requirements_pytorch.txt ← Dependencies
```
---
## ⏱️ Thời gian ước tính
### Với GPU (NVIDIA RTX 3090)
- Huấn luyện: 10-15 phút
- Dự đoán: 15-20 phút
- **Total: ~30 phút**
### Với CPU (Intel i7-10700K)
- Huấn luyện: 1-2 giờ
- Dự đoán: 2-4 giờ
- **Total: 3-6 giờ**
### Với GPU (NVIDIA GTX 1660)
- Huấn luyện: 30-45 phút
- Dự đoán: 45-60 phút
- **Total: ~1.5 giờ**
---
## ✅ Checklist
- [ ] PyTorch cài đặt thành công
- [ ] CUDA available (nếu có GPU)
- [ ] Dependencies cài đặt: `pip install -r requirements_pytorch.txt`
- [ ] Dữ liệu training có sẵn: `train/ST_training data_updated_1130points_new.shp`
- [ ] Datacube configured
- [ ] Chạy 04.train_CNN_PyTorch_ODC.ipynb
- [ ] Model lưu thành công: `model_train/model_cnn_pytorch.pth`
- [ ] Chạy 05.predict_CNN_PyTorch_ODC.ipynb
- [ ] Classification map tạo thành công
- [ ] GeoTIFF file có thể mở được trong QGIS/ArcGIS
---
## 📚 Tham khảo
- **PyTorch Docs**: https://pytorch.org/docs/
- **Conv1D Docs**: https://pytorch.org/docs/stable/generated/torch.nn.Conv1d.html
- **1D CNN for Time Series**: https://arxiv.org/abs/1611.06251
- **Early Stopping**: https://pytorch.org/docs/stable/generated/torch.optim.lr_scheduler.ReduceLROnPlateau.html
---
## 🎯 Next Steps
1. ✅ Huấn luyện CNN model
2. ✅ Dự đoán classification map
3. 🔲 So sánh kết quả với Random Forest
4. 🔲 Fine-tune hyperparameters
5. 🔲 Ensemble CNN + Random Forest
6. 🔲 Deploy model lên production
---
**Happy training! 🚀**
Mọi câu hỏi, kiểm tra các file README hoặc thử troubleshooting section.