Home »
Blog »
AI/ML Engineer সিরিজ » Series 06 » Episode 07
Transfer Learning: ছোট data দিয়ে বড় কাজ (pretrained model ব্যবহার)
data-efficient Deep Learning (Series 06, Episode 07)
🟡 INTERMEDIATE
Series 06 — Deep Learning with PyTorch
Episode 07 / 08
📑 এই পর্বে যা যা আছে
- ১. গল্প: "মাত্র ২০০ ছবি, কীভাবে model বানাব?"
- ২. সমস্যা: Deep Learning-এর data-খিদে
- ৩. Transfer Learning-এর মূল ধারণা
- ৪. Feature extraction বনাম Fine-tuning
- ৫. তিন স্তরে বুঝি
- ৬. Pretrained model → embedding-এর আভাস
- ৭. সম্পূর্ণ কোড: ResNet দিয়ে transfer learning
- ৮. Visual: pretrained backbone + নতুন head
- ৯. Experiment: freeze বনাম fine-tune
- ১০. বাংলাদেশের বাস্তব উদাহরণ
- ১১. Boss Question
- ১২. Job Requirement Decoder
- ১৩. সাধারণ ভুল ধারণা
- ১৪. Interview Prep
- ১৫. হাতে-কলমে
- ১৬. Project Connection ও সারসংক্ষেপ
🧩 ১. গল্প: "মাত্র ২০০ ছবি, কীভাবে model বানাব?"
একটা agri-tech startup Rahim-কে বলল — "আমাদের কাছে ধানপাতার রোগের মাত্র ২০০টা ছবি আছে। এটা দিয়ে একটা
classifier বানাও।" Rahim ঘাবড়ে গেল — গত পর্বের CNN তো হাজার হাজার ছবিতে শিখেছিল। ২০০ ছবিতে scratch থেকে
CNN train করলে তো ভয়ংকর overfit করবে!
Rahim: "আপা, এত কম data-তে Deep Learning তো কাজ করবে না। তাহলে কি classical ML-এ ফিরে যাব?"
Maya: "না না, একটা দারুণ কৌশল আছে — transfer learning। কেউ একজন ইতিমধ্যে লাখ লাখ
ছবিতে (ImageNet) একটা বিশাল model train করে রেখেছে। সেই model edge, texture, আকৃতি — এসব সাধারণ জিনিস
আগেই শিখে ফেলেছে। আমরা শুধু তার শেষ অংশটা আমাদের ২০০ ছবিতে একটু শিখিয়ে নেব। এতে কম data-তেই দুর্দান্ত ফল।"
❓ ২. সমস্যা: Deep Learning-এর data-খিদে
Deep Learning-এর বড় দুর্বলতা — এটা প্রচুর data চায়। scratch থেকে একটা ভালো CNN train করতে সাধারণত
হাজার হাজার (কখনো লাখ) labeled ছবি লাগে। কিন্তু বাস্তবে, বিশেষ করে বাংলাদেশের অনেক domain-এ (medical,
কৃষি, local product), এত labeled data জোগাড় করা কঠিন ও ব্যয়বহুল।
Transfer learning এই সমস্যার সবচেয়ে ব্যবহারিক সমাধান — অন্যের শেখা "সাধারণ জ্ঞান" ধার করে, নিজের ছোট
data-তে শুধু "বিশেষ জ্ঞান" যোগ করা। junior AI engineer-দের জন্য এটা প্রায় দৈনন্দিন হাতিয়ার।
💡 ৩. Transfer Learning-এর মূল ধারণা
একটা pretrained CNN (যেমন ResNet, ImageNet-এর ১৪ লাখ ছবিতে train করা) দুই ভাগে ভাবুন:
- Backbone (feature extractor): শুরুর সব conv layer — এগুলো সাধারণ visual feature
(edge, texture, আকৃতি) শিখে ফেলেছে, যা প্রায় সব ছবিতেই কাজে লাগে।
- Head (classifier): শেষ Linear layer — এটা ImageNet-এর ১০০০ class-এর জন্য specific।
Transfer learning = backbone-টা রেখে দিই (সে তো সাধারণ জিনিস জানেই), শুধু head-টা বদলে আমাদের সমস্যার
(যেমন ধানপাতার ৩ রোগ) জন্য নতুন করে train করি।
🔀 ৪. Feature extraction বনাম Fine-tuning
| কৌশল | কী করি | কখন |
| Feature Extraction | backbone freeze (weight fixed), শুধু নতুন head train | খুব কম data; দ্রুত; নিরাপদ শুরু |
| Fine-tuning | head + backbone-এর কিছু/সব layer ছোট lr-এ একটু train | মাঝারি data; domain আলাদা হলে; আরও accuracy দরকার |
Engineer টিপ: প্রথমে feature extraction দিয়ে baseline নিন। ফল যথেষ্ট না হলে fine-tuning
(backbone-এর শেষ কয়েক layer unfreeze করে খুব ছোট learning rate-এ)। ছোট lr কেন? — pretrained
weight যেন হঠাৎ নষ্ট না হয়ে যায়।
🎯 ৫. তিন স্তরে বুঝি
Level 1 — intuition: একজন অভিজ্ঞ শিল্পীকে নতুন একটা style শেখাতে সপ্তাহখানেক লাগে;
একদম নতুন কাউকে বছরের পর বছর। pretrained model = অভিজ্ঞ শিল্পী।
Level 2 — technical: pretrained weight দিয়ে network শুরু হয় (random নয়)। backbone
freeze করলে শুধু নতুন head-এর gradient হিসাব হয়; fine-tune-এ কিছু backbone layer-ও update হয়।
Level 3 — engineer: বাস্তবে ৯০%+ image project transfer learning দিয়েই হয় — কেউ
scratch থেকে train করে না যদি না বিশাল data ও কারণ থাকে। এটা সময়, GPU খরচ ও data দরকার — তিনটাই বাঁচায়।
🧬 ৬. Pretrained model → embedding-এর আভাস
একটা গুরুত্বপূর্ণ ধারণা: pretrained backbone-এর শেষ layer-এর আগে যে vector তৈরি হয় (head-এ ঢোকার আগে),
সেটা আসলে ছবিটার একটা embedding — মানে ছবিটার "অর্থপূর্ণ সংখ্যাগত সারাংশ"। একই রকম ছবির
embedding কাছাকাছি থাকে।
সতর্কতা (accuracy): এটা image embedding-এর আভাস মাত্র। text embedding, semantic
similarity, vector database — এসব আমরা Series 07 ও 08-এ বিস্তারিত দেখব। আর মনে রাখবেন,
embedding ≠ LLM — embedding হলো একটা সংখ্যাগত representation, LLM হলো generation model।
দুটো ভিন্ন জিনিস, যদিও দুটোই Deep Learning থেকে আসে।
💻 ৭. সম্পূর্ণ কোড: ResNet দিয়ে transfer learning
torchvision-এর pretrained ResNet18 দিয়ে (কোনো নতুন dependency নয়):
import torch
import torch.nn as nn
from torchvision import models, transforms
from torchvision.datasets import ImageFolder
from torch.utils.data import DataLoader
device = "cuda" if torch.cuda.is_available() else "cpu"
# 1) pretrained model যে transform-এ train হয়েছিল, সেটাই লাগবে
tf = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
transforms.Normalize([0.485, 0.456, 0.406], # ImageNet mean
[0.229, 0.224, 0.225]), # ImageNet std
])
# data/ ফোল্ডারে প্রতিটা class-এর নিজস্ব সাবফোল্ডার (ImageFolder format)
train_ds = ImageFolder("data/leaf/train", transform=tf)
train_loader = DataLoader(train_ds, batch_size=16, shuffle=True)
n_classes = len(train_ds.classes) # যেমন 3 রোগ
# 2) pretrained ResNet18 লোড
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
# 3) backbone FREEZE (feature extraction)
for p in model.parameters():
p.requires_grad = False
# 4) শেষ head বদলে আমাদের class সংখ্যায় নতুন Linear (এটা train হবে)
model.fc = nn.Linear(model.fc.in_features, n_classes)
model = model.to(device)
criterion = nn.CrossEntropyLoss()
# শুধু নতুন head-এর parameter optimize করছি
optimizer = torch.optim.Adam(model.fc.parameters(), lr=0.001)
# 5) training (মাত্র কয়েক epoch-এই ভালো ফল)
for epoch in range(5):
model.train()
for xb, yb in train_loader:
xb, yb = xb.to(device), yb.to(device)
optimizer.zero_grad()
loss = criterion(model(xb), yb)
loss.backward()
optimizer.step()
print(f"epoch {epoch+1} done | loss {loss.item():.3f}")
torch.save(model.state_dict(), "leaf_resnet18.pt")
মূল লাইনগুলো: requires_grad=False backbone freeze করল;
model.fc = nn.Linear(...) নতুন head বসাল; optimizer-এ শুধু model.fc.parameters()
দিলাম — মানে শুধু head শিখবে। ফলে মাত্র ২০০ ছবিতেও দ্রুত, নির্ভরযোগ্য ফল, কম overfit।
🖼️ ৮. Visual: pretrained backbone + নতুন head
ImageNet-এ শেখা (FROZEN) আমাদের (TRAINED)
┌──────────────────────────┐ ┌───────────────┐
│ Conv layers (backbone) │ │ নতুন Linear │
│ edge → texture → আকৃতি │ ──────> │ head │ ──> ৩ রোগ
│ (weight fixed) │ embedding│ (শুধু এটা শেখে)│
└──────────────────────────┘ └───────────────┘
🧪 ৯. Experiment: freeze বনাম fine-tune
উপরের কোড চালানোর পর, একটা দ্বিতীয় ধাপে backbone-এর শেষ block unfreeze করুন
(for p in model.layer4.parameters(): p.requires_grad = True) এবং optimizer-এ সেগুলোও যোগ
করে খুব ছোট lr (যেমন 1e-4) দিন। accuracy কি বাড়ল? সাধারণত মাঝারি data-তে সামান্য বাড়ে। এই
তুলনাই feature extraction vs fine-tuning-এর বাস্তব অনুভূতি দেবে।
🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ
- কৃষি: সীমিত labeled পাতার ছবি — transfer learning ছাড়া উপায় নেই।
- Medical imaging: রোগীর গোপনীয়তার কারণে data কম; pretrained model দিয়ে শুরু করা মানক পদ্ধতি।
- Local product/logo চেনা: ছোট কোম্পানির অল্প ছবিতেই কাজ চালানো যায়।
মানে বাংলাদেশের data-সীমিত বাস্তবতায় transfer learning একটা superpower — junior হিসেবে এটা জানা মানেই অনেক project সম্ভব হয়ে ওঠে।
💼 ১১. Boss Question
Boss: "আমাদের তো লাখ লাখ ছবি নেই। তাহলে কি আমরা AI product বানাতেই পারব না?"
উত্তর: "পারব স্যার — transfer learning-এর জন্যই। বড় কোম্পানির লাখ লাখ ছবিতে শেখা model
আমরা বিনামূল্যে ব্যবহার করে, আমাদের অল্প data-তে শুধু শেষ অংশটা শিখিয়ে নিতে পারি। মানে কম data, কম GPU,
কম সময়েই একটা কার্যকর product — বিনিয়োগ অনেক কম, ফল দ্রুত।"
🔎 ১২. Job Requirement Decoder
"Familiarity with transfer learning / pretrained models."
| প্রশ্ন | উত্তর |
| কী বোঝায়? | pretrained model নিয়ে নিজের সমস্যায় adapt করতে পারেন। |
| কেন চায়? | বাস্তবে বেশিরভাগ image/NLP কাজ এভাবেই হয়; scratch training বিরল। |
| কোন সমস্যা সমাধান করে? | কম data, কম compute, কম সময়ে ভালো model। |
| junior-এর কী জানা লাগে? | backbone freeze, head বদলানো, feature extraction vs fine-tuning, সঠিক preprocessing (ImageNet normalize)। |
| এখনই কী master লাগে না? | layer-wise LR, domain adaptation-এর গভীর তত্ত্ব, নতুন pretraining। |
| GitHub-এ কীভাবে দেখাবে? | ছোট dataset-এ ResNet transfer learning project + "scratch বনাম transfer" তুলনা। |
| interview-তে কী? | "Transfer learning কী?", "কখন freeze, কখন fine-tune?" |
⚠️ ১৩. সাধারণ ভুল ধারণা
ভুল ১: pretrained model-এর জন্য ভুল preprocessing (ImageNet normalize বাদ) → খারাপ ফল।
ভুল ২: কম data-তে পুরো model বড় lr-এ fine-tune → pretrained জ্ঞান নষ্ট (catastrophic forgetting)।
ভুল ৩: backbone freeze করে optimizer-এ পুরো model দেওয়া → head-only train হচ্ছে না ভেবে বিভ্রান্তি।
ভুল ৪: "transfer learning মানে সবসময় fine-tuning" → না, feature extraction-ও transfer learning।
ভুল ৫: input image size pretrained model-এর প্রত্যাশিত size (224×224) না মেলানো।
🎤 ১৪. Interview Prep
প্রশ্ন ১: Transfer learning কী ও কেন কাজ করে?
উত্তর: pretrained model-এর শেখা সাধারণ feature reuse করা; শুরুর layer-এর feature প্রায় সব ছবিতেই কাজে লাগে বলে কম data-তেও চলে।
প্রশ্ন ২: Feature extraction বনাম fine-tuning?
উত্তর: extraction = backbone freeze, শুধু head train; fine-tuning = কিছু backbone layer-ও ছোট lr-এ train।
প্রশ্ন ৩: Fine-tuning-এ ছোট learning rate কেন?
উত্তর: pretrained weight যেন হঠাৎ বড় update-এ নষ্ট না হয়।
প্রশ্ন ৪: কম data-তে scratch training-এর সমস্যা কী?
উত্তর: তীব্র overfit; transfer learning সেই ঝুঁকি কমায়।
✍️ ১৫. হাতে-কলমে
১. একটা ছোট image dataset (২–৩ class, প্রতি class ৫০–১০০ ছবি) নিয়ে ResNet18 transfer learning করুন।
২. একই dataset-এ E06-এর scratch CNN train করে accuracy তুলনা করুন — পার্থক্য লিখুন।
৩. backbone-এর layer4 unfreeze করে fine-tune করুন; ফল কি বাড়ল?
৪. একটা নতুন ছবিতে predict করে দেখান (inference)।
📌 ১৬. Project Connection ও সারসংক্ষেপ
এই transfer-learning কৌশল আমাদের P4 image classifier-কে (flagship V4) production-ready করে — কম data-তেও
ভালো accuracy। আর pretrained model থেকে embedding পাওয়ার ধারণাটা সরাসরি Series 07-08-এর NLP embedding ও
RAG-এর দিকে সেতু তৈরি করল।
এই পর্বে শিখলাম:
✓ Deep Learning data-খিদে; transfer learning সেই সমস্যার ব্যবহারিক সমাধান
✓ backbone (সাধারণ feature) freeze + নতুন head train = feature extraction
✓ feature extraction বনাম fine-tuning কখন কোনটা
✓ torchvision ResNet18 দিয়ে সম্পূর্ণ transfer learning ও সঠিক preprocessing
✓ pretrained backbone থেকে image embedding-এর ধারণা (embedding ≠ LLM)
পরবর্তী পর্ব (S06E08): "PyTorch বনাম TensorFlow/Keras" — সৎ তুলনা, industry কী চায়,
আর model save/load/inference — Series 09-এ deploy করার আগে গুছিয়ে নেওয়া।