অধ্যায়Phase 5 · ডিপ লার্নিং ফর ভিশন
5.2 10 মিনিট পড়া
Transfer Learning
Pre-trained model fine-tuning।
🎬 গল্প দিয়ে শুরু
একটি মেডিক্যাল classifier train করতে কি ১ মিলিয়ন ছবি দরকার? না — কারণ ImageNet-এর ১.৪ মিলিয়ন ছবিতে train করা একটি ResNet-এর প্রথম layer-গুলো ইতিমধ্যেই “দেখতে” শিখে গেছে। সেটাই Transfer Learning।
দুটি কৌশল
- Feature extraction — pre-trained backbone freeze; শুধু শেষ classifier train।
- Fine-tuning — backbone unlock করে ছোট learning rate দিয়ে full train।
PyTorch — ResNet-18 fine-tune
python
finetune.py
import torch, torch.nn as nn
from torchvision import models, transforms, datasets
from torch.utils.data import DataLoader
device = "cuda" if torch.cuda.is_available() else "cpu"
# 1. Pre-trained backbone
net = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
for p in net.parameters(): p.requires_grad = False # freeze
net.fc = nn.Linear(net.fc.in_features, 5) # 5 class
net = net.to(device)
# 2. Data + transforms
tfm = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224),
transforms.ToTensor(),
transforms.Normalize([0.485,0.456,0.406],
[0.229,0.224,0.225]),
])
train = datasets.ImageFolder("data/train", transform=tfm)
loader = DataLoader(train, batch_size=32, shuffle=True)
# 3. Loss + optimizer (only fc params)
opt = torch.optim.Adam(net.fc.parameters(), lr=1e-3)
loss = nn.CrossEntropyLoss()
# 4. Train loop
for epoch in range(5):
net.train()
for x, y in loader:
x, y = x.to(device), y.to(device)
opt.zero_grad()
out = net(x); l = loss(out, y); l.backward(); opt.step()
print(f"Epoch {epoch}: loss {l.item():.3f}")ImageNet normalization
Pre-trained model train হয়েছে fixed mean/std-এ। ভুলে normalize না করলে accuracy ৩০% drop।
Fine-tune — last few layers unfreeze
python
# Stage 2: শেষ block unfreeze
for p in net.layer4.parameters(): p.requires_grad = True
opt = torch.optim.Adam([
{"params": net.layer4.parameters(), "lr": 1e-4},
{"params": net.fc.parameters(), "lr": 1e-3},
])কোন backbone কখন?
| Model | Params | Use case |
|---|---|---|
| MobileNetV3 | ~5M | Mobile, edge, real-time |
| ResNet-50 | 25M | General-purpose baseline |
| EfficientNet-B0 | 5M | Best accuracy/param |
| ConvNeXt | 29M+ | Modern, SOTA classification |
| ViT-B/16 | 86M | Transformer; বড় dataset হলে ভালো |
Tips for small datasets
- Data augmentation aggressive (Phase 5.3)।
- Backbone freeze → fc train → তারপর top layers unfreeze।
- LR scheduler — CosineAnnealing বা OneCycle।
- Early stopping — val_loss না কমলে থামান।
- Class imbalance থাকলে weighted loss/sampler।
প্র্যাকটিস টাস্ক
- ৫টি ফুলের ছবি (১০০টি করে) দিয়ে ResNet-18 fine-tune করুন।
- Freeze vs full fine-tune accuracy তুলনা করুন।
- MobileNetV3 ও ResNet-50 একই dataset-এ চালিয়ে speed/accuracy লিখুন।
সারসংক্ষেপ
- Pre-trained model = ইতিমধ্যে শেখা feature extractor।
- ছোট dataset → freeze + classifier; বড় → fine-tune।
- ImageNet normalize আবশ্যিক।
- Backbone choice নির্ভর করে latency budget + accuracy goal-এ।