অধ্যায়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 কখন?

ModelParamsUse case
MobileNetV3~5MMobile, edge, real-time
ResNet-5025MGeneral-purpose baseline
EfficientNet-B05MBest accuracy/param
ConvNeXt29M+Modern, SOTA classification
ViT-B/1686MTransformer; বড় 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।
প্র্যাকটিস টাস্ক
  1. ৫টি ফুলের ছবি (১০০টি করে) দিয়ে ResNet-18 fine-tune করুন।
  2. Freeze vs full fine-tune accuracy তুলনা করুন।
  3. MobileNetV3 ও ResNet-50 একই dataset-এ চালিয়ে speed/accuracy লিখুন।

সারসংক্ষেপ

  • Pre-trained model = ইতিমধ্যে শেখা feature extractor।
  • ছোট dataset → freeze + classifier; বড় → fine-tune।
  • ImageNet normalize আবশ্যিক।
  • Backbone choice নির্ভর করে latency budget + accuracy goal-এ।