Memahami convolution, pooling, stride & padding yang membuat jaringan bisa membaca gambar, mengenal arsitektur ResNet, EfficientNet, dan MobileNet, lalu praktik klasifikasi CIFAR-10 dari nol sampai CNN yang akurat.

Di episode 5 kita mengklasifikasi gambar dengan MLP yang mem-flatten seluruh gambar menjadi vektor. Hasilnya sekitar 90% untuk Fashion-MNIST — lumayan, tapi jelas belum optimal, dan untuk gambar berwarna kompleks MLP akan jeblok. Inilah alasan lahirnya CNN (Convolutional Neural Network): arsitektur yang menghormati struktur spasial gambar.
CNN bukan sekadar "lebih baik untuk gambar". Ia juga menjadi fondasi visual untuk semua model modern — dari detector mobil di jalan sampai vision encoder pada model multimodal di episode 21. Pahami mekanikanya sekarang, dan separuh arsitektur yang kalian temui di industri akan terasa familier.
Gambar CIFAR-10 berukuran 32x32x3 = 3072 angka. MLP memperlakukan 3072 angka itu sebagai vektor tanpa arti posisi. Dua masalah muncul:
CNN menjawab dengan berbagi bobot (weight sharing): satu filter kecil digeser ke seluruh gambar. Lokalitas dan translasi-invariance datang gratis.
Filter (kernel) kecil, misalnya 3x3, digeser melintasi gambar dan menghitung dot product di setiap posisi. Hasilnya peta fitur yang menonjolkan pola tertentu — tepi, sudut, tekstur:
Stride mengontrol seberapa jauh filter bergeser tiap langkah. Stride 1 menghasilkan peta fitur selebar input; stride 2 mengecilkannya. Padding menambah nol di tepi gambar agar peta fitur tidak menyusut terlalu cepat dan tepi gambar tidak diabaikan.
Max pooling mengambil nilai maksimum di setiap blok kecil (misal 2x2), mengurangi resolusi dan membuat model lebih toleran terhadap pergeseran kecil. Pooling memberi translation invariance dan memangkas parameter.
import torch.nn as nn
block = nn.Sequential(
nn.Conv2d(3, 32, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(2),
)Pola klasik: conv → ReLU → pool, diulang dengan jumlah channel meningkat (32 → 64 → 128) dan resolusi menurun. Di ujung, flatten ke classifier fully-connected.
ResNet (2015) menjawab masalah jaringan yang justru makin buruk saat makin dalam: gradien hilang. Solusinya residual connection — blok mempelajari selisih (residual), bukan peta penuh:
y = x + f(x) # f = dua lapis convKarena output minimal x, gradien selalu punya jalur lurus mundur. Ini memungkinkan jaringan ratusan layer. Ide yang sama mendasari transformer dan hampir semua arsitektur modern.
CIFAR-10: 60.000 gambar berwarna 32x32 dari 10 kelas (pesawat, mobil, burung, ...). Mari bangun CNN sederhana:
class CNN(nn.Module):
def __init__(self):
super().__init__()
self.features = nn.Sequential(
nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(),
nn.Conv2d(32, 32, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2),
nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(),
nn.Conv2d(64, 64, 3, padding=1), nn.ReLU(),
nn.MaxPool2d(2),
)
self.classifier = nn.Sequential(
nn.Flatten(),
nn.Linear(64 * 8 * 8, 128), nn.ReLU(),
nn.Linear(128, 10),
)
def forward(self, x):
return self.classifier(self.features(x))Alur: 32x32x3 → conv (32 ch) → pool (16x16) → conv (64 ch) → pool (8x8) → flatten → 128 → 10. Karena hanya 64 channel terakhir dan resolusi 8x8, flatten menghasilkan 64×8×8 = 4096 — jauh lebih masuk akal daripada MLP murni.
Latih dengan AdamW, cosine schedule, dan augmentasi dari episode 6. Target yang bisa dicapai CNN kecil ini di CIFAR-10: ~70-75% accuracy (vs ~45-50% MLP murni). Lompatan itu persis kontribusi convolution.
Tip
Ukuran gambar CIFAR-10 sangat kecil, jadi padding sangat penting. Tanpa padding=1 pada conv 3x3, resolusi 32x32 menyusut tiap layer dan cepat habis sebelum flatten. Biasakan menghitung dimensi peta fitur secara manual saat mendesign arsitektur.
Melatih CNN dari nol di CIFAR-10 butuh cukup lama. Di dunia nyata, kita hampir selalu memakai pretrained — arsitektur yang sudah dilatih di ImageNet (14 juta gambar). Keluarkan fitur tanpa training, atau fine-tune beberapa layer terakhir:
import torchvision.models as models
backbone = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
backbone.fc = nn.Linear(512, 10) # ganti classifierCara ini biasanya langsung memberikan akurasi 85-90% di CIFAR-10 tanpa training lama. Detail lengkap strategi ini — kapan fine-tune vs freeze — kita bahas khusus di episode 8.
Conv2d(3, 32, 3) tanpa padding di gambar kecil cepat kehabisan resolusi. Hitung dimensi sebelum menulis arsitektur.nn.Linear(512, 10) cocok dengan ResNet18, tapi arsitektur lain beda output channel — cek backbone dulu.(batch, ch, h, w); flatten sebelum masuk nn.Linear.Warning
CNN di episode ini hanya baseline untuk pemahaman. Sebelum membangun dari nol untuk proyek nyata, selalu tanya: apakah pretrained sudah cukup? Melatih dari nol hanya layak jika data kalian sangat berbeda dari domain pretrained (misalnya citra medis atau satelit yang tidak ada di ImageNet).
Pada episode 7 ini, kalian telah membangun fondasi computer vision.
Inti yang harus dibawa pulang:
Di episode 8 selanjutnya kita akan fokus penuh pada transfer learning & pretrained models — perbedaan fine-tuning vs feature extraction, kapan memakai pretrained, dan pipeline lengkap dengan torchvision dan Hugging Face. Sampai jumpa di episode 8!