Menguasai transfer learning: perbedaan fine-tuning vs feature extraction, kapan memakai pretrained ImageNet, perlakuan freezing layer dan learning rate berbeda, serta pipeline lengkap dengan torchvision dan Hugging Face.

Di akhir episode 7 kalian melihat satu baris resnet18(weights=DEFAULT) yang langsung memberi akurasi tinggi. Sekarang kita membedah apa yang sebenarnya terjadi dan bagaimana memanfaatkannya secara benar. Transfer learning adalah keterampilan paling praktis di seluruh deep learning: hampir tidak ada proyek serius di 2026 yang melatih model dari nol, kecuali data sangat khusus atau model benar-benar baru.
Inti transfer learning: fitur yang dipelajari dari satu domain (14 juta gambar ImageNet) sebagian besar berguna untuk domain lain (mobil, produk, x-ray). Tepi dan tekstur dasar bersifat universal. Kita memindahkan "bahasa visual" ini dan tinggal mengajarkan tugas spesifik kita.
Bobot pretrained dikunci (freeze) — hanya classifier baru yang dilatih. Backbone berperan sebagai ekstraktor fitur yang sudah jadi:
import torchvision.models as models
import torch.nn as nn
backbone = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
for param in backbone.parameters():
param.requires_grad = False
backbone.fc = nn.Linear(512, 10) # hanya ini yang dilatihCepat, murah, butuh data sedikit. Cocok saat data kalian kecil dan domainnya tidak terlalu jauh dari ImageNet.
Semua bobot tetap bisa diperbarui, tetapi dengan learning rate lebih kecil untuk backbone. Backbone sudah punya fitur bagus; kita hanya menyetelnya sedikit agar sesuai domain:
optimizer = torch.optim.AdamW([
{"params": backbone.parameters(), "lr": 1e-5},
{"params": backbone.fc.parameters(), "lr": 1e-4},
])Dua learning rate ini merefleksikan dua kepercayaan berbeda: backbone hampir selesai (lr kecil), classifier baru dimulai (lr lebih besar).
| Kondisi | Pilihan |
|---|---|
| Data kecil, domain dekat ImageNet | Feature extraction |
| Data besar, domain dekat | Fine-tune backbone |
| Data kecil, domain jauh (medis/satelit) | Feature extraction dari model domain-spesifik |
| Data besar, domain jauh | Fine-tune dari pretrained, perbanyak augmentasi |
Aturan jempol: mulai dengan feature extraction sebagai baseline, lalu fine-tune jika validation sudah plateau dan kalian punya data cukup.
Tiga alasan fundamental:
Untuk tugas di luar torchvision, Hugging Face menyediakan ribuan pretrained model siap pakai — dari klasifikasi gambar sampai deteksi objek:
from transformers import pipeline
classifier = pipeline("image-classification", model="google/vit-base-patch16-224")
result = classifier("kucing.jpg")
print(result)Hugging Face juga menyediakan image processor dan feature extractor yang konsisten dengan cara training model aslinya — menghilangkan banyak bug dimensi yang biasa terjadi saat memakai model external secara manual.
Tip
Saat memakai model Hugging Face, selalu pakai processor/feature extractor yang disertakan bersama model (misal AutoImageProcessor.from_pretrained). Model dilatih dengan preprocessing spesifik — melewatkan normalisasi yang benar adalah salah satu penyebab paling umum akurasi turun drastis tanpa alasan jelas.
import torch
import torch.nn as nn
import torchvision.models as models
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
model.fc = nn.Linear(512, 10)
optimizer = torch.optim.AdamW(model.parameters(), lr=1e-4, weight_decay=1e-2)
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max=15)
loss_fn = nn.CrossEntropyLoss()
for epoch in range(15):
model.train()
for x, y in train_loader:
optimizer.zero_grad()
loss = loss_fn(model(x), y)
loss.backward()
optimizer.step()
scheduler.step()Dengan augmentasi ringan dan 15 epoch, ResNet18 yang di-fine-tune di CIFAR-10 mudah menembus 90-95% — dibanding ~70-75% CNN dari nol. Selisih itu adalah nilai transfer learning.
Warning
Pastikan normalisasi input sesuai standar pretrained: untuk ResNet ImageNet itu mean [0.485, 0.456, 0.406] dan std [0.229, 0.224, 0.225]. Lupa menerapkan normalisasi ini membuat transfer learning hampir tidak berguna — fitur backbone menerima input di luar distribusinya.
model.eval() untuk layer frozen, atau fine-tune sebagai gantinya.Pada episode 8 ini, kalian telah menguasai transfer learning.
Inti yang harus dibawa pulang:
pipeline dan AutoImageProcessor menyederhanakan penggunaan pretrained.Di episode 9 selanjutnya kita akan membangun data pipeline yang benar — Dataset & DataLoader di PyTorch, batching, shuffling, prefetch, dan augmentasi dengan torchvision transforms serta Albumentations untuk robustness. Sampai jumpa di episode 9!