Mengapa train dari nol kalau model sudah belajar dari 14 juta gambar? Part 4 mengajarkan cara menggunakan pre-trained ResNet untuk mengenali objek baru — hanya dengan mengganti "kepala" network. Dari 20% akurasi (train from scratch) ke 96%+ (transfer learning) dalam 5 epoch.
📅 Maret 2026⏱ 25 menit baca🏷 PyTorch • Transfer Learning • ResNet • Fine-Tuning • Pre-trained
Mengapa Transfer Learning? — Dari 14 juta gambar ke dataset Anda
ResNet: Skip Connections — Arsitektur yang merevolusi deep learning
2 Strategi Transfer Learning — Feature extraction vs fine-tuning
Kode: Feature Extraction — Freeze semua, train kepala saja
Kode: Fine-Tuning — Unfreeze sebagian, train bersama
Grad-CAM: Lihat Apa yang Dilihat Model — Visualisasi "attention"
Kapan Pakai Strategi Mana? — Decision framework
Ringkasan & Preview Part 5
🧠
1. Mengapa Transfer Learning?
Train from scratch = buang waktu dan data. Pakai model yang sudah pintar.
Di Part 1-3, kita train model dari nol (random weights). Untuk MNIST (angka sederhana 28×28), ini berhasil. Tapi untuk gambar real-world — kucing vs anjing, bunga, X-ray — kita butuh jutaan gambar dan berhari-hari training. Transfer learning menyelesaikan ini.
🧠 Transfer Learning — Pinjam "Otak" yang Sudah Terlatih
💡 Analogi: Belajar Bahasa Baru
Bayangkan Anda sudah fasih Bahasa Inggris (= pre-trained model). Sekarang mau belajar Belanda. Anda tidak mulai dari nol — alfabet sama, grammar mirip, banyak kata serupa. Anda hanya perlu belajar perbedaannya. Itulah transfer learning: model sudah "fasih" mengenali edges, shapes, textures. Anda hanya perlu mengajarinya perbedaan antara bunga mawar dan bunga tulip.
🏗️
2. ResNet — Skip Connections yang Merevolusi DL
ResNet memungkinkan network sangat dalam (152 layers!) tanpa kehilangan gradient
🏗️ Residual Block — Rahasia Kedalaman ResNet
Model
Layers
Params
ImageNet Top-1
Speed
Best For
ResNet-18
18
11.7M
69.8%
🟢 Sangat cepat
Prototype, data kecil, edge devices
ResNet-34
34
21.8M
73.3%
🟢 Cepat
Balance speed + accuracy
ResNet-50
50
25.6M
76.1%
🟡 Medium
Production, general purpose
ResNet-101
101
44.5M
77.4%
🟡 Lambat
Akurasi tinggi, GPU kuat
ResNet-152
152
60.2M
78.3%
🔴 Sangat lambat
Kompetisi, riset
EfficientNet-B0
-
5.3M
77.1%
🟢 Efisien
Mobile, edge, resource-limited
⚡
3. Dua Strategi Transfer Learning
Feature extraction (cepat, simpel) vs Fine-tuning (akurasi lebih tinggi)
⚡ Dua Strategi — Feature Extraction vs Fine-Tuning
💻
4. Kode: Feature Extraction
Freeze semua, ganti kepala, train hanya FC layer
13_feature_extraction.py — Transfer Learning Strategy A
import torch
import torch.nn as nn
import torchvision
from torchvision import models, transforms
from torch.utils.data import DataLoader
# ===========================# STEP 1: Load pre-trained ResNet-18# ===========================
model = models.resnet18(weights='IMAGENET1K_V1')
# ↑ Download 44.7MB model yang sudah terlatih di ImageNet# Model ini SUDAH tahu: edges, textures, shapes, objects# ===========================# STEP 2: FREEZE semua layer (jangan diubah)# ===========================for param in model.parameters():
param.requires_grad = False# 🔒 Freeze!# ===========================# STEP 3: GANTI "kepala" (FC layer terakhir)# ===========================# ResNet-18 asli: fc = Linear(512, 1000) → 1000 kelas ImageNet# Kita ganti jadi: fc = Linear(512, 10) → 10 kelas kita
num_features = model.fc.in_features # 512
model.fc = nn.Linear(num_features, 10) # 🔓 Layer baru (trainable!)# Hitung: berapa parameter yang akan di-train?
trainable = sum(p.numel() for p in model.parameters() if p.requires_grad)
total = sum(p.numel() for p in model.parameters())
print(f"Trainable: {trainable:,} / {total:,} ({100*trainable/total:.1f}%)")
# Trainable: 5,130 / 11,181,642 (0.05%)# ↑ Hanya 0.05% parameter yang di-train! Sisanya frozen.# ===========================# STEP 4: Data transforms (resize ke 224×224 untuk ResNet)# ===========================
transform = transforms.Compose([
transforms.Resize(256),
transforms.CenterCrop(224), # ResNet expects 224×224
transforms.ToTensor(),
transforms.Normalize(
[0.485, 0.456, 0.406], # ImageNet mean (RGB)
[0.229, 0.224, 0.225] # ImageNet std (RGB)
)
])
# ===========================# STEP 5: Optimizer — HANYA train FC parameters!# ===========================
device = torch.device("cuda"if torch.cuda.is_available() else"cpu")
model = model.to(device)
optimizer = torch.optim.SGD(
model.fc.parameters(), # ← HANYA fc layer!
lr=0.001,
momentum=0.9
)
loss_fn = nn.CrossEntropyLoss()
💡 Key Insight: Dari 11.1 juta parameter, kita hanya train 5.130 (0.05%)! Sisanya frozen — tetap menggunakan knowledge dari ImageNet. Ini mengapa feature extraction sangat cepat dan data-efficient.
🔧
5. Kode: Fine-Tuning (Akurasi Lebih Tinggi)
Unfreeze layer terakhir + train dengan learning rate berbeda
14_fine_tuning.py — Transfer Learning Strategy B
# ===========================# Fine-Tuning: Unfreeze layer terakhir# ===========================# Load pre-trained model
model = models.resnet18(weights='IMAGENET1K_V1')
# Freeze SEMUA dulufor param in model.parameters():
param.requires_grad = False# Unfreeze layer4 (layer terakhir sebelum FC)for param in model.layer4.parameters():
param.requires_grad = True# 🔓 Unfreeze!# Ganti FC head
num_features = model.fc.in_features
model.fc = nn.Linear(num_features, 10)
# ===========================# Discriminative Learning Rates!# Layer dekat input → lr kecil (fitur dasar, jangan ubah banyak)# Layer dekat output → lr besar (perlu adaptasi ke task baru)# ===========================
optimizer = torch.optim.Adam([
{'params': model.layer4.parameters(), 'lr': 1e-4}, # LR kecil
{'params': model.fc.parameters(), 'lr': 1e-3}, # LR normal
])
# Learning rate scheduler: turunkan LR setiap 7 epoch
scheduler = torch.optim.lr_scheduler.StepLR(
optimizer, step_size=7, gamma=0.1
)
# Training loop (sama seperti biasa)for epoch inrange(15):
model.train()
for images, labels in train_loader:
images, labels = images.to(device), labels.to(device)
pred = model(images)
loss = loss_fn(pred, labels)
optimizer.zero_grad()
loss.backward()
optimizer.step()
scheduler.step() # Update LR# Feature Extraction: ~91-94% akurasi# Fine-Tuning: ~96-98% akurasi ← Jauh lebih baik!
🎓 Discriminative Learning Rates
Layer dekat input sudah belajar fitur universal (edges, gradients) — ini berlaku untuk semua gambar, jadi kita hanya perlu sedikit tweak (lr kecil: 0.0001). Layer dekat output belajar fitur spesifik (bentuk wajah, pola bunga) — ini perlu disesuaikan ke task baru (lr besar: 0.001). Pendekatan ini disebut discriminative learning rates dan memberikan hasil terbaik.
🔥
6. Grad-CAM: "Apa yang Dilihat Model?"
Visualisasi heatmap — area mana yang membuat model memutuskan prediksi
Grad-CAM (Gradient-weighted Class Activation Mapping) memvisualisasikan area mana di gambar yang paling mempengaruhi prediksi model. Ini penting untuk: memverifikasi model melihat hal yang benar, debugging kesalahan, dan menjelaskan keputusan AI.
🔥 Grad-CAM — Heatmap "Attention" Model
15_gradcam.py — Visualisasi Grad-CAM
# pip install pytorch-grad-camfrom pytorch_grad_cam import GradCAM
from pytorch_grad_cam.utils.image import show_cam_on_image
# Target layer: layer terakhir sebelum FC
cam = GradCAM(
model=model,
target_layers=[model.layer4[-1]] # Conv layer terakhir
)
# Generate heatmap
input_tensor = transform(image).unsqueeze(0).to(device)
grayscale_cam = cam(input_tensor=input_tensor)
# Overlay heatmap di atas gambar asli
visualization = show_cam_on_image(
rgb_image, # Gambar asli (numpy)
grayscale_cam[0], # Heatmap
use_rgb=True
)
# Tampilkanimport matplotlib.pyplot as plt
plt.imshow(visualization)
plt.title("Grad-CAM: Apa yang Dilihat Model?")
plt.axis('off')
plt.show()
🎯
7. Kapan Pakai Strategi Mana?
Decision framework berdasarkan ukuran data dan kemiripan domain
Situasi
Data Anda
Strategi
Contoh
Data kecil, domain mirip
100-1000 gambar, mirip ImageNet
Feature Extraction
Classify anjing breeds, jenis mobil
Data besar, domain mirip
10K+ gambar, mirip ImageNet
Fine-Tuning (unfreeze later layers)
Product recognition, food classification
Data kecil, domain berbeda
100-1000, sangat beda dari ImageNet
Feature Extraction (hati-hati)
X-ray medis, satellite imagery
Data besar, domain berbeda
50K+, sangat beda
Fine-Tuning (unfreeze banyak/semua)
Microscopy, industrial defect
Real-time / edge device
Any
EfficientNet / MobileNet
Mobile app, IoT camera, drone
⚠️ Aturan Emas: Selalu mulai dengan Feature Extraction dulu (cepat, murah, baseline). Jika akurasi belum cukup, baru naik ke Fine-Tuning. Jangan langsung unfreeze semua — mulai dari layer terakhir, evaluate, baru unfreeze lebih banyak jika perlu.
📝
8. Ringkasan Part 4
Konsep baru yang kita kuasai
Konsep
Apa Itu
Kode Kunci
Transfer Learning
Pinjam knowledge dari model pre-trained
models.resnet18(weights='IMAGENET1K_V1')
Freeze Layers
Matikan gradient → layer tidak berubah
param.requires_grad = False
Replace Head
Ganti FC layer terakhir untuk task baru
model.fc = nn.Linear(512, num_classes)
Feature Extraction
Freeze semua, train hanya head baru
Optimizer: model.fc.parameters()
Fine-Tuning
Unfreeze sebagian layer + train bersama
model.layer4.parameters() + model.fc
Discriminative LR
LR berbeda per layer group
[{'params': ..., 'lr': 1e-4}, ...]
LR Scheduler
Turunkan LR otomatis setiap N epoch
StepLR(optimizer, step_size=7, gamma=0.1)
ResNet Skip Connection
Output = F(x) + x → gradient bisa shortcut
Built-in di arsitektur ResNet
Grad-CAM
Heatmap: area mana yang diperhatikan model
GradCAM(model, target_layers=[...])
ImageNet Normalize
Mean/std khusus ImageNet (wajib untuk pre-trained)