Transfer Learning: ছোট data দিয়ে বড় কাজ (pretrained model ব্যবহার)

data-efficient Deep Learning (Series 06, Episode 07)

🟡 INTERMEDIATE Series 06 — Deep Learning with PyTorch Episode 07 / 08

📑 এই পর্বে যা যা আছে

🧩 ১. গল্প: "মাত্র ২০০ ছবি, কীভাবে 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 করা) দুই ভাগে ভাবুন:

Transfer learning = backbone-টা রেখে দিই (সে তো সাধারণ জিনিস জানেই), শুধু head-টা বদলে আমাদের সমস্যার (যেমন ধানপাতার ৩ রোগ) জন্য নতুন করে train করি।

🔀 ৪. Feature extraction বনাম Fine-tuning

কৌশলকী করিকখন
Feature Extractionbackbone freeze (weight fixed), শুধু নতুন head trainখুব কম data; দ্রুত; নিরাপদ শুরু
Fine-tuninghead + 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-এর বাস্তব অনুভূতি দেবে।

🇧🇩 ১০. বাংলাদেশের বাস্তব উদাহরণ

মানে বাংলাদেশের 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 করার আগে গুছিয়ে নেওয়া।
© 2025 Sheikh Thanbir Alam. All Rights Reserved. thanbirtamim.github.io
এই লেখা মূল লেখকের সম্পত্তি — লিখিত অনুমতি ছাড়া কপি করে অন্য কোনো ওয়েবসাইট, ব্লগ, বই বা প্ল্যাটফর্মে প্রকাশ/বিতরণ করা কঠোরভাবে নিষিদ্ধ। Content may not be copied or republished without permission.