পাঠ ২৩ · ৪০-এর মধ্যে · মডিউল ৩

Transfer Learning

Transfer learning — leveraging pretrained models
৭ মিনিট পড়া মাঝারি · Intermediate PyTorch hands-on

এই পাঠে যা শিখবেন

  • Transfer learning-এর intuition — কেন ImageNet feature transferable
  • Feature extraction vs fine-tuning — কখন কোনটা
  • Discriminative learning rate
  • Domain gap — source ও target dataset-এর difference
  • PyTorch torchvision থেকে pretrained model ব্যবহার
  • Bangla/Bangladesh dataset-এ practical strategy

১ · কেন transfer learning দরকার

একটি ResNet-50 — ImageNet-এর ১.২M image-এ ১০০ epoch train করতে — ৮টি V100 GPU-এ ১ দিন। আপনার Bangladesh-এর custom flower dataset — ৫০০ image। শূন্য থেকে train করলে — overfitting অবধারিত।

সমাধান: ImageNet-এ pretrained ResNet-50 — সেই network-এর শেখা feature (edge, texture, shape) ফুল identification-এ-ও কাজে লাগে।

Transfer learning

Source task ($T_s$, e.g. ImageNet) → Target task ($T_t$, e.g. Bangla flower)। Source network-এর weight target-এ initial value হিসেবে। Network-এর parameter কিছু freeze, কিছু update।

২ · কেন কাজ করে — feature hierarchy

Yosinski et al. (২০১৪) — "How transferable are features in deep neural networks?":

  • Layer 1-2 (early): edge, color, texture — universal across natural images।
  • Layer 3-4 (mid): pattern, motif — somewhat universal।
  • Layer 5+ (late): object-specific, ImageNet class-aware — least transferable।
  • Final FC: fully task-specific — সবসময় replace।
ভাবুন আপনি একজন chef। নতুন রান্না শিখতে — চাকু কাটা, পেঁয়াজ ভাজা, water boil — এই basic skill-গুলো আগে থেকেই আছে। শুধু recipe (top layer) — নতুন। Transfer learning ঠিক একই — pretrained network-এর "general skill" reuse, "specific recipe" নতুন।

৩ · দু'টি principal mode

Mode A — Feature extraction:

  • Pretrained network freeze (require_grad=False)।
  • শেষ FC layer replace + train।
  • Network-কে fixed feature extractor হিসেবে ব্যবহার।
  • ভাল — small data (< 1000), domain similar।

Mode B — Fine-tuning:

  • Pretrained weight load করে — সব layer train।
  • Learning rate কম (1e-4 বা 1e-5) — pretrained feature destroy না করতে।
  • ভাল — bigger data (5000+), domain-এ moderate difference।

Mode C — Hybrid (discriminative LR):

  • Early layer — low lr (1e-5)।
  • Late layer — medium lr (1e-4)।
  • Head — high lr (1e-3)।
  • Best of both — practitioner's choice।

৪ · PyTorch — feature extraction

Python · PyTorch
import torch
import torch.nn as nn
import torchvision.models as models

# Pretrained ResNet-50
model = models.resnet50(weights='IMAGENET1K_V2')

# Freeze সব
for p in model.parameters():
    p.requires_grad = False

# Replace final FC for 5 class (Bangladesh flowers)
model.fc = nn.Sequential(
    nn.Dropout(0.5),
    nn.Linear(2048, 5),
)

# শুধু head trainable
trainable = [p for p in model.parameters() if p.requires_grad]
print("Trainable params:", sum(p.numel() for p in trainable))
# ~10K — original model 25M

optim = torch.optim.AdamW(trainable, lr=1e-3, weight_decay=0.01)
loss_fn = nn.CrossEntropyLoss()

    

৫ · PyTorch — fine-tuning

Python · PyTorch
model = models.resnet50(weights='IMAGENET1K_V2')
model.fc = nn.Linear(2048, 5)

# সব layer trainable
for p in model.parameters():
    p.requires_grad = True

# Discriminative LR
optim = torch.optim.AdamW([
    {'params': model.conv1.parameters(),  'lr': 1e-5},
    {'params': model.bn1.parameters(),    'lr': 1e-5},
    {'params': model.layer1.parameters(), 'lr': 1e-5},
    {'params': model.layer2.parameters(), 'lr': 1e-5},
    {'params': model.layer3.parameters(), 'lr': 5e-5},
    {'params': model.layer4.parameters(), 'lr': 1e-4},
    {'params': model.fc.parameters(),     'lr': 1e-3},
], weight_decay=0.01)

    
Transfer Learning — Source → Target Pretrained weights reuse, head replace Source: ImageNet (1.2M) Conv stem Block 1-4 (deep features) GAP FC: 1000 (ImageNet) Train: 1 day, 8 GPU Transfer copy + replace head Target: Bangla flowers (500) Conv stem (frozen) Block 1-4 (frozen / low lr) GAP FC: 5 (NEW, train) Train: 30 min, 1 GPU কেন কাজ করে: Conv stem ও early blocks — edges, textures, colors (universal) Late blocks — patterns, parts (somewhat universal) FC head — task-specific (always replace) Result: 500 image → 90%+ accuracy। 0 থেকে train করলে — 50% হত।
Transfer learning — pretrained network-এর শেখা features নতুন task-এ ব্যবহার। Time, data, ও cost সব সাশ্রয়।

৬ · Domain gap — কতটা matter করে

  • Small gap: ImageNet → CIFAR-10, custom flower — feature extraction যথেষ্ট।
  • Medium gap: ImageNet → medical image — fine-tune প্রয়োজন।
  • Large gap: ImageNet → satellite/MRI — domain pre-training plus fine-tune।
  • Cross-modal: ImageNet → audio spectrogram — surprisingly works (ResNet)।

৭ · কখন full pretrain → কখন from scratch

  • Always pretrain: data < 10K, RGB image, standard classification।
  • Pretrain helps: 10K-100K data — convergence faster।
  • From scratch ok: 1M+ data, very different domain (3D MRI, satellite hyperspectral)।
  • Domain pretrain: medical → RadImageNet, Bangla → Bangla pretrained ResNet।

৮ · Common mistakes

Python · pitfalls
# ❌ Mistake 1: Same lr as scratch — pretrained feature destroy
optim = AdamW(model.parameters(), lr=1e-3)  # বেশি!

# ✅ Fix: lower lr
optim = AdamW(model.parameters(), lr=1e-4)

# ❌ Mistake 2: BN train mode — small data এ noisy
# Many fine-tuning code BN momentum reduce করে নাই
model.train()  # BN running stats update — risky

# ✅ Fix: Freeze BN bin small data:
for m in model.modules():
    if isinstance(m, nn.BatchNorm2d):
        m.eval()
        for p in m.parameters():
            p.requires_grad = False

# ❌ Mistake 3: Wrong normalization
# ImageNet mean/std না দিয়ে — feature shift
# ✅ Fix: torchvision-এর correct stats
T.Normalize([0.485, 0.456, 0.406],
            [0.229, 0.224, 0.225])

    

৯ · Modern transfer learning trends

  • Self-supervised pretrain: SimCLR, MoCo, DINO, MAE — labeled-data ছাড়াই pretrain।
  • CLIP: image-text joint embedding — zero-shot transfer।
  • Foundation model: SAM, DINOv2 — universal feature।
  • LoRA / Adapter: parameter-efficient fine-tuning — large model practical।
"Pretrained → fine-tune" আজ default starting point। শূন্য থেকে train শুধুই academic curiosity বা very specialized scenario। Bangladesh-এর সব production CV system — ImageNet/foundation pretrained বেস।

ভাবনার প্রশ্ন

প্রতিটি প্রশ্ন নিজে কিছুক্ষণ ভাবুন — তারপর "→ উত্তর" চাপুন।

প্র ০১ Yosinski et al. (২০১৪) দেখান — early layer "general", late layer "specific"। কিন্তু feature transfer-এর সাথে "co-adaptation" ভাঙার কথাও বলেন। কী এটা?

Yosinski et al. — "How transferable are features in deep neural networks?" — DL community-র classic paper। Multiple insight।

Findings:

  • Layer 1-2 — task-independent features।
  • Layer 3-4 — partial dependent।
  • Layer 5+ — task-specific।
  • Final layers — fully specific।

Co-adaptation problem:

  • Network train-এ — layer parameters jointly optimized।
  • Layer 3 weight depends on layer 2 weight।
  • Layer 4 — layer 3 specific feature expect।
  • Adjacent layers — codependent।

Why transfer breaks co-adaptation:

  • Layer 1-3 transfer + layer 4-5 random initialize।
  • Layer 4-5 — layer 3-এর "expected" pattern না দেখে।
  • Co-adaptation broken।
  • Optimization difficulty।

Empirical observation:

  • Layer 3 only freeze + 4-5 random — accuracy drop।
  • Layer 1-3 freeze + 4-5 fine-tune — better।
  • Layer 1-7 freeze + 8 fine-tune — best for similar task।

The "splitting" experiment:

  • Train AnB-এ — A, B random class split।
  • BnB — same dataset transfer (no domain gap)।
  • BnB-এ কিছু performance drop — pure co-adaptation ভাঙা।
  • Even same-task transfer cost।

Practical implications:

  • Feature extraction (freeze all but head) — co-adaptation preserved।
  • Fine-tuning (all layers) — co-adaptation reform।
  • Freezing partial — risky middle ground।
  • Discriminative LR — best of both।

Modern understanding:

  • BatchNorm — adaptation help।
  • Skip connection — robust to layer shift।
  • Self-attention — flexible adaptation।
  • Modern transfer easier than 2014।

Adapter modules:

  • Frozen pretrained + small trainable bottleneck।
  • Co-adaptation preserved।
  • New adaptation in small modules।
  • Parameter-efficient (LoRA, Houlsby adapters)।

Bangladesh transfer scenarios:

  • ImageNet → Bangla characters — full fine-tune (large gap)।
  • ImageNet → Bangla flora — feature extraction enough।
  • ImageNet → medical X-ray — discriminative LR।
  • Domain matters।

মূল উপলব্ধি: Yosinski "transfer features" আবিষ্কার + co-adaptation challenge identify। Modern era — adapters, LoRA, BN — co-adaptation impact reduce। Feature extraction safe, fine-tune adjustable। Bangladesh-এ — domain gap-অনুসারে strategy। Transfer learning theory practical insight।

প্র ০২ "ImageNet pretrained CV-র জন্য universal" — এই assumption সবসময় valid? Medical imaging বা satellite-এ কি problem?

ImageNet — natural object centric। Medical/satellite — significantly different। Transfer learning সব domain-এ trivial না।

ImageNet bias:

  • Center-cropped photo।
  • Single object focus।
  • Natural lighting।
  • Real-world objects।
  • 3-channel RGB।

Medical imaging-এ challenge:

  • Grayscale প্রায়ই (X-ray)।
  • Anatomical structure — natural object না।
  • Subtle pathology — careful feature।
  • Image quality variation hospital-অনুসারে।

Satellite imagery challenge:

  • Top-down view।
  • Multi-spectral (RGB+IR)।
  • Object scale 1px - meter।
  • Geographical pattern।

Empirical findings:

  • Medical: ImageNet pretrain — slight benefit।
  • RadImageNet (medical) — better।
  • Domain pretrain — best।
  • Self-supervised on domain data — competitive।

The "universal" myth:

  • Universal — degree-অনুসারে।
  • Edge/texture — most universal।
  • Mid-features — somewhat।
  • High-level — least।

Domain-specific pretraining:

  • RadImageNet: 1.4M radiology images — medical features।
  • BigEarthNet: 590K satellite images।
  • BraTS: brain MRI segmentation।
  • Domain pretrain consistently helpful।

Self-supervised alternatives:

  • Unlabeled domain data utilize।
  • Contrastive (SimCLR, MoCo)।
  • Masked autoencoder (MAE)।
  • DINOv2 — general-purpose।

Hybrid approach:

  • ImageNet → domain pretrain → task fine-tune।
  • Stagewise transfer।
  • Each stage knowledge accumulate।
  • Best results।

Bangladesh medical AI:

  • CheXNet (DenseNet pretrained)।
  • BdLekha medical text।
  • Self-supervised on Bangladesh hospital data।
  • Domain adaptation critical।

Practical strategy decision tree:

  • Domain similar to ImageNet? → Standard transfer।
  • Different domain, large data? → Self-supervised + fine-tune।
  • Different + small data? → Domain pretrain + fine-tune।
  • Very specialized? → Custom architecture + domain pretrain।

Cross-modal transfer:

  • Audio spectrogram → image (works!)।
  • 3D MRI → 2D ResNet (slice-wise)।
  • Multi-spectral → RGB equivalent।
  • Creativity in adaptation।

Common pitfalls:

  • Wrong normalization (ImageNet stats on medical)।
  • Standard augmentation may damage subtle pathology।
  • Class imbalance handling।
  • Validation strategy domain-specific।

Recent trends:

  • Foundation models (DINOv2) — domain transfer good।
  • Vision Transformer — adapt easier।
  • Multi-modal pretraining।
  • Few-shot learning।

Cost-benefit:

  • Domain pretraining expensive।
  • Sometimes ImageNet sufficient।
  • Empirical comparison essential।
  • Bangladesh — start simple।

মূল উপলব্ধি: ImageNet — natural image bias। Medical/satellite-এ partial transfer। Domain pretrain consistently helpful। Self-supervised emerging powerful। Bangladesh — Bengali characters, X-ray, satellite — domain-specific approach। Universal feature partial reality। Transfer learning landscape evolving fast।

প্র ০৩ "Self-supervised pretraining" আজ-এ replacement হিসেবে ImageNet-এর। SimCLR, DINO, MAE — কী fundamental shift আনল?

Self-supervised learning (SSL) — deep learning-এর recent বিপ্লব। Labeled data-এর dependency drastically কমায়।

Supervised pretraining limit:

  • Need labeled data (expensive)।
  • ImageNet bias inherits।
  • Bangla, Bangladesh labeled data scarce।
  • Foundation model unlabeled use।

SSL key idea:

  • Pretext task — auto-generated label।
  • No human annotation।
  • Massive unlabeled data utilize।
  • General feature learn।

Major SSL methods:

(১) Contrastive (SimCLR, MoCo):

  • একই image-এর দু'টো aug — pull together।
  • ভিন্ন image — push apart।
  • InfoNCE loss।
  • Strong feature learn।

(২) Masked image modeling (MAE):

  • BERT vision counterpart।
  • 75% patch mask।
  • Reconstruct missing।
  • ViT-friendly।

(৩) Self-distillation (DINO, DINOv2):

  • Student-teacher network।
  • Different views — same feature predict।
  • No negative samples।
  • Stable training।

(৪) Predictive (BYOL, SwAV):

  • One view — predict other view।
  • Cluster assignment।
  • Negative-free।

SimCLR architecture:

def simclr_loss(z1, z2, tau=0.1):
    """z1, z2: two augmented views' embeddings"""
    z = torch.cat([z1, z2], dim=0)  # (2N, D)
    z = F.normalize(z, dim=1)
    sim = z @ z.T / tau  # (2N, 2N)

    N = z1.size(0)
    targets = torch.arange(N).repeat(2)
    targets = (targets + N) % (2 * N)

    mask = torch.eye(2*N, dtype=torch.bool).to(z.device)
    sim.masked_fill_(mask, -float('inf'))

    return F.cross_entropy(sim, targets)

DINO key insight:

  • Teacher EMA student।
  • Centering + sharpening prevent collapse।
  • Self-attention emergent properties।
  • Object boundary auto-discovery।

MAE simplicity:

# MAE pseudocode
def forward(self, x):
    # Mask 75% patches
    x_masked, mask = random_mask(x, ratio=0.75)
    # Encode visible patches
    encoded = encoder(x_masked)
    # Decoder reconstruct full image
    decoded = decoder(encoded, mask)
    # Loss only on masked
    loss = F.mse_loss(decoded[mask], x[mask])
    return loss

Performance comparison:

  • SimCLR — ResNet-50 on ImageNet — 76% (vs supervised 76%)।
  • DINOv2 — ViT-L — 86%।
  • MAE — ViT-H — 87%।
  • Match/exceed supervised।

Transfer ability:

  • SSL features — better generalization।
  • Fewer labels need fine-tune।
  • Robust to distribution shift।
  • Few-shot strong।

Foundation model era:

  • DINOv2 — universal vision feature।
  • SAM — segmentation foundation।
  • CLIP — image-text joint।
  • Multi-task capable।

Bangladesh utilization:

  • Unlabeled Bangladesh medical images abundant।
  • SSL pretrain on local data।
  • Few-shot Bangla character recognition।
  • Cultural-specific feature emergence।

Compute requirements:

  • SSL pretraining — expensive (8-32 GPU)।
  • Fine-tune — affordable।
  • Foundation model — academic infrastructure প্রয়োজন।
  • Pretrained available (Hugging Face)।

Practical workflow:

  • Start: pre-trained DINOv2/MAE।
  • Fine-tune on labeled data।
  • Few-shot if data scarce।
  • Linear probe simple tasks।

Limitation:

  • Pretext task not always task-relevant।
  • Augmentation choice critical।
  • Mode collapse risk।
  • Foundation model bias inherits।

Future direction:

  • Multi-modal SSL।
  • Video SSL।
  • 3D SSL।
  • Domain-specific foundation।

Bangladesh research opportunity:

  • Bangla SSL pretrain (BERT-like)।
  • Local culture image SSL।
  • Medical SSL on local hospital data।
  • Foundation model for South Asian context।

মূল উপলব্ধি: Self-supervised pretraining — DL-এর next paradigm। Labeled data dependency drastic reduce। SimCLR, DINO, MAE — different approaches, similar outcome। Foundation model era enable। Bangladesh — local data SSL utilize। Transfer learning evolution — supervised → self-supervised → foundation। Research democratize, deployment simplify।

প্র ০৪ Bangladeshi flower species classifier (১৫ class, ১৫০০ image) — কোন pretrained model বাছবেন? কী strategy?

Bangladesh flora — specific cultural/biological dataset। Practical transfer learning project।

Dataset analysis:

  • 1500 image / 15 class = 100 image/class।
  • Small but workable।
  • Domain — natural image (ImageNet similar)।
  • Class imbalance possible (some flower rare)।

Bangladesh flowers special:

  • Shapla (water lily) — national flower।
  • Kadam, Krishnachura, Bakul — cultural significance।
  • Visually similar species — fine-grained challenge।
  • Lighting, season variation।

Model selection:

  • Tier 1 (default): ResNet-50 pretrained ImageNet।
  • Tier 2: EfficientNet-B0 (efficient)।
  • Tier 3: DINOv2 (foundation)।
  • Tier 4: Plant-specific (PlantNet pretrained)।

Recommended: ResNet-50 + DINOv2:

import torch
import torch.nn as nn
import torchvision.models as models
import torchvision.transforms as T

# ResNet-50 ImageNet
resnet = models.resnet50(weights='IMAGENET1K_V2')
resnet.fc = nn.Sequential(
    nn.Dropout(0.5),
    nn.Linear(2048, 15),
)

# Or DINOv2 (more modern)
# dino = torch.hub.load('facebookresearch/dinov2',
#                       'dinov2_vitb14')

Training pipeline:

train_transform = T.Compose([
    T.Resize(256),
    T.RandomResizedCrop(224, scale=(0.8, 1.0)),
    T.RandomHorizontalFlip(),
    T.RandomRotation(15),
    T.ColorJitter(0.3, 0.3, 0.3, 0.1),
    T.ToTensor(),
    T.Normalize([0.485, 0.456, 0.406],
                [0.229, 0.224, 0.225]),
])

val_transform = T.Compose([
    T.Resize(256),
    T.CenterCrop(224),
    T.ToTensor(),
    T.Normalize([0.485, 0.456, 0.406],
                [0.229, 0.224, 0.225]),
])

Strategy 1: Quick start (feature extract):

for p in resnet.parameters():
    p.requires_grad = False
for p in resnet.fc.parameters():
    p.requires_grad = True

optim = torch.optim.AdamW(
    resnet.fc.parameters(),
    lr=1e-3, weight_decay=0.01)
# 20 epoch — 80% accuracy reasonable

Strategy 2: Full fine-tune:

for p in resnet.parameters():
    p.requires_grad = True

# Discriminative LR
params = [
    {'params': resnet.conv1.parameters(),  'lr': 1e-5},
    {'params': resnet.layer1.parameters(), 'lr': 1e-5},
    {'params': resnet.layer2.parameters(), 'lr': 5e-5},
    {'params': resnet.layer3.parameters(), 'lr': 1e-4},
    {'params': resnet.layer4.parameters(), 'lr': 5e-4},
    {'params': resnet.fc.parameters(),     'lr': 1e-3},
]
optim = torch.optim.AdamW(params, weight_decay=0.01)
sched = torch.optim.lr_scheduler.CosineAnnealingLR(
    optim, T_max=30)
# 30 epoch — 90%+ accuracy

Augmentation specific to flowers:

  • Lighting jitter — outdoor variation।
  • Rotation — flower pose।
  • Color shift — season/time।
  • Random crop — different parts focus।

Class imbalance handling:

from torch.utils.data import WeightedRandomSampler

# Compute class frequencies
class_counts = [count_per_class[i] for i in range(15)]
class_weights = 1.0 / torch.tensor(class_counts).float()
sample_weights = class_weights[targets]

sampler = WeightedRandomSampler(
    sample_weights, len(sample_weights))
loader = DataLoader(dataset, batch_size=32,
                    sampler=sampler)

Validation strategy:

  • 5-fold cross-validation।
  • Stratified split (class balance)।
  • Hold-out test — different photographer/location।
  • Top-1, top-3 accuracy।

Common errors visualize:

  • Confusion matrix।
  • Common misclassification pair।
  • Hard examples — manual review।
  • Domain-specific insight।

Test-time augmentation:

def tta_predict(model, x, n=5):
    model.eval()
    preds = []
    for _ in range(n):
        x_aug = augment(x)
        with torch.no_grad():
            preds.append(F.softmax(model(x_aug), -1))
    return torch.stack(preds).mean(0)

Ensemble:

  • 5 fold model average।
  • Different architecture combine।
  • +2-3% accuracy gain।
  • Production deployment cost vs benefit।

Mobile deployment:

  • EfficientNet-B0 — small + fast।
  • Quantization (INT8)।
  • ONNX export।
  • Bangla flower app।

Bangladesh-specific deployment:

  • Bangla flower name + scientific।
  • Cultural significance display।
  • Medicinal use info (where applicable)।
  • Educational content।

Active learning:

  • Uncertain prediction — expert review।
  • Dataset grow iteratively।
  • Model improvement continuous।

Interpretability:

  • Grad-CAM — model attention।
  • Feature visualization।
  • "Why this flower?" explanation।

Use cases:

  • Educational app for school children।
  • Botanical research tool।
  • Tourism guide।
  • Conservation monitoring।

Realistic expectation:

  • 1500 image, 15 class — 90-95% achievable।
  • Confusion in similar species — manual fallback।
  • Production ready with TTA + ensemble।

মূল উপলব্ধি: Bangladesh flower classifier — practical transfer learning project। ResNet-50 ImageNet sufficient starting point। Discriminative LR + augmentation + class balance — recipe। 90%+ accuracy achievable। Mobile deployment quantized model। Educational + cultural app value। Bangladesh-এ AI accessibility — pretrained model leverage essential। Local domain global tool integration।

অনুশীলন

  1. Replace head: torchvision-এর VGG-16 — 7 class classification-এর জন্য head replace।
    import torchvision.models as m
    vgg = m.vgg16(weights='IMAGENET1K_V1')
    # VGG classifier last layer index 6
    vgg.classifier[6] = nn.Linear(4096, 7)
  2. Freeze conv: ResNet-50-এর সব conv freeze করে শুধু FC train। কত trainable parameter বাকি?
    import torchvision.models as m
    model = m.resnet50(weights='IMAGENET1K_V2')
    for p in model.parameters():
        p.requires_grad = False
    model.fc = nn.Linear(2048, 10)
    trainable = sum(p.numel() for p in model.parameters()
                    if p.requires_grad)
    print(trainable)  # 2048*10 + 10 = 20,490
  3. Discriminative LR: ResNet-18-এ stem-এ 1e-5, layer1-2-এ 5e-5, layer3-4-এ 1e-4, fc-এ 1e-3 — set up।
    params = [
        {'params': list(model.conv1.parameters()) + list(model.bn1.parameters()),
         'lr': 1e-5},
        {'params': list(model.layer1.parameters()) + list(model.layer2.parameters()),
         'lr': 5e-5},
        {'params': list(model.layer3.parameters()) + list(model.layer4.parameters()),
         'lr': 1e-4},
        {'params': model.fc.parameters(), 'lr': 1e-3},
    ]
    optim = torch.optim.AdamW(params, weight_decay=0.01)

আরও পড়ুন · ABCL TECH-এ আপনার পরবর্তী পদক্ষেপ

কোড রানার কাজ না করলে? ব্রাউজারে কাজ না করলে Google Colab ব্যবহার করুন — Google-এর ফ্রি অনলাইন Python পরিবেশ, শুধু Gmail অ্যাকাউন্ট লাগে।
পূর্ববর্তী পাঠ
পাঠ ২২ · ResNet