Chapter 22

ট্রান্সফার লার্নিং

Transfer Learning
🎬 অন্যের শেখা কাজে লাগান
Transfer Learning হলো — ImageNet-এর মতো বিশাল ডেটাসেটে pretrained মডেলের শেখা feature ব্যবহার করে আপনার ছোট ডেটাসেটে দ্রুত ও ভালো ফল পাওয়া। আধুনিক CV-র সবচেয়ে শক্তিশালী কৌশল।

কখন Transfer Learning?

  • আপনার ডেটাসেট ছোট (১০০–১০,০০০)।
  • Domain ImageNet-এর কাছাকাছি (natural images)।
  • Compute সীমিত — scratch থেকে train অসম্ভব।

দুটি কৌশল

কৌশল
কখন
কী হয়
Feature Extraction
খুব ছোট ডেটা
Backbone freeze, শুধু head train
Fine-tuning
মাঝারি ডেটা
উপরের কয়েকটি block unfreeze, কম lr-এ train

Keras দিয়ে Feature Extraction

from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras import layers, models

base = EfficientNetB0(include_top=False, weights="imagenet",
                      input_shape=(224,224,3))
base.trainable = False           # freeze

inp = layers.Input((224,224,3))
x = base(inp, training=False)
x = layers.GlobalAveragePooling2D()(x)
x = layers.Dropout(0.3)(x)
out = layers.Dense(num_classes, activation="softmax")(x)

model = models.Model(inp, out)
model.compile(optimizer="adam", loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])
model.fit(train_ds, validation_data=val_ds, epochs=10)

Fine-tuning

base.trainable = True
# শেষ 30 layer ছাড়া সব freeze
for layer in base.layers[:-30]:
    layer.trainable = False

model.compile(optimizer=tf.keras.optimizers.Adam(1e-5),  # ছোট lr!
              loss="sparse_categorical_crossentropy",
              metrics=["accuracy"])
model.fit(train_ds, validation_data=val_ds, epochs=10)
🔑 ছোট lr কেন?
Pretrained weights প্রায় ঠিকঠাক — বড় lr দিলে শেখা সব ভেঙে যাবে (catastrophic forgetting)। 1e-4 থেকে 1e-5 সাধারণত নিরাপদ।

PyTorch দিয়ে Fine-tuning

import torch, torch.nn as nn
from torchvision import models

net = models.resnet50(weights="IMAGENET1K_V2")
for p in net.parameters():
    p.requires_grad = False

net.fc = nn.Linear(net.fc.in_features, num_classes)

opt = torch.optim.Adam(net.fc.parameters(), lr=1e-3)
# fine-tune stage:
for p in net.layer4.parameters():
    p.requires_grad = True
opt = torch.optim.Adam(filter(lambda p: p.requires_grad, net.parameters()), lr=1e-5)

জনপ্রিয় Backbone

  • ResNet50 / 101 — নির্ভরযোগ্য baseline।
  • EfficientNet B0-B7 — accuracy/parameter ভারসাম্য।
  • ConvNeXt — আধুনিক, transformer-comparable।
  • ViT, Swin — Vision Transformer পরিবার।

সাধারণ ভুল

⚠️ এড়িয়ে চলবেন
  • Preprocessing ভুল — প্রতিটি মডেলের নিজস্ব mean/std আছে।
  • Head train না করেই fine-tune — gradient backbone নষ্ট করে।
  • BatchNorm training=True রাখা — frozen backbone-এ গন্ডগোল।

অনুশীলন

১. Flowers ডেটাসেটে EfficientNetB0 দিয়ে 95%+ accuracy অর্জন করুন।

২. Feature extraction vs fine-tuning — training time ও accuracy তুলনা করুন।

৩. ResNet50 ও ConvNeXt-Tiny তুলনা করুন।

সারসংক্ষেপ

✨ এই অধ্যায়ে যা শিখলাম
  • Pretrained মডেল ছোট ডেটায় দ্রুত-ভালো ফল দেয়।
  • আগে head train, পরে কম lr-এ fine-tune।
  • EfficientNet ও ConvNeXt আধুনিক backbone।