1. Pengenalan CNN
Convolutional Neural Network (CNN) adalah jenis neural network yang dirancang khusus untuk memproses data berbentuk grid, terutama gambar (2D grid pixel). CNN merevolusi bidang Computer Vision dan menjadi fondasi dari hampir semua sistem pengenalan gambar modern.
Mengapa CNN, Bukan Neural Network Biasa?
Bayangkan kita menggunakan neural network biasa (Fully Connected / Dense) untuk gambar 224Ć224 piksel dengan 3 channel (RGB). Input layer saja akan memiliki 224 Ć 224 Ć 3 = 150.528 neuron. Jika hidden layer pertama memiliki 1000 neuron, maka hanya layer pertama saja sudah membutuhkan 150 juta parameter! Ini tidak praktis.
Aplikasi CNN
| Aplikasi | Contoh | Kenapa CNN? |
|---|---|---|
| Image Classification | Label foto (kucing/anjing/mobil) | Deteksi pola visual hierarkis |
| Object Detection | YOLO, Faster R-CNN | Deteksi + lokalisasi objek dalam gambar |
| Semantic Segmentation | U-Net (medical imaging) | Klasifikasi setiap pixel |
| Face Recognition | FaceNet, DeepFace | Feature extraction wajah |
| Self-driving Cars | Tesla, Waymo | Deteksi rambu, pejalan kaki, jalur |
| Medical Imaging | Deteksi tumor, kanker | Pola abnormal pada X-ray/MRI |
| Text Classification | Sentiment analysis | 1D CNN untuk text |
| Video Analysis | Action recognition | 3D CNN untuk video frames |
2. Convolution Layer
Convolution layer adalah blok utama dari CNN. Layer ini menggunakan filter (juga disebut kernel atau weight) yang "bergeser" melintasi input gambar untuk mendeteksi fitur-fitur tertentu.
Bagaimana Convolution Bekerja
Jenis Filter/Kernel
CNN secara otomatis belajar filter apa yang paling berguna. Tapi untuk pemahaman, berikut beberapa filter manual yang dikenal:
| Filter | Kernel | Fungsi |
|---|---|---|
| Vertical Edge | [[-1,0,1],[-1,0,1],[-1,0,1]] | Deteksi tepi vertikal |
| Horizontal Edge | [[-1,-1,-1],[0,0,0],[1,1,1]] | Deteksi tepi horizontal |
| Sharpen | [[0,-1,0],[-1,5,-1],[0,-1,0]] | Memperjelas gambar |
| Blur (Gaussian) | [[1,2,1],[2,4,2],[1,2,1]]/16 | Memblur gambar (mengurangi noise) |
| Embassy | [[-2,-1,0],[-1,1,1],[0,1,2]] | Memberi efek 3D |
Stride
Stride menentukan berapa langkah filter bergeser pada setiap operasi. Stride 1 = geser satu pixel. Stride 2 = geser dua pixel (output lebih kecil).
Rumus Output Size
Output Size = (Input Size - Kernel Size + 2 Ć Padding) / Stride + 1
Contoh: Input 32Ć32, Kernel 5Ć5, Padding 2, Stride 1:
Output = (32 - 5 + 2Ć2) / 1 + 1 = 32 ā Output 32Ć32 (sama!) ā ini disebut "same" padding
| Kombinasi | Input | Kernel | Padding | Stride | Output |
|---|---|---|---|---|---|
| Valid (no padding) | 32Ć32 | 3Ć3 | 0 | 1 | 30Ć30 |
| Same padding | 32Ć32 | 3Ć3 | 1 | 1 | 32Ć32 |
| Downsample 2Ć | 32Ć32 | 3Ć3 | 1 | 2 | 16Ć16 |
| Large kernel | 28Ć28 | 5Ć5 | 0 | 1 | 24Ć24 |
| Same large kernel | 28Ć28 | 5Ć5 | 2 | 1 | 28Ć28 |
| Jenis Pooling | Operasi | Kelebihan | Penggunaan |
|---|---|---|---|
| Max Pooling | Ambil nilai maksimum per region | Pertahankan fitur kuat | Paling umum (default) |
| Average Pooling | Ambil rata-rata per region | Smooth, tidak kehilangan info | Global Average Pooling (akhir jaringan) |
| Global Average Pooling | Rata-rata SELURUH feature map ā 1 nilai per channel | Sangat mengurangi parameter | Akhir CNN sebelum classifier |
| Stochastic Pooling | Random sampling sesuai distribusi | Regularisasi | Jarang digunakan |
5. Arsitektur CNN Lengkap
Sebuah arsitektur CNN lengkap terdiri dari beberapa komponen yang bekerja bersama:
Struktur Umum CNN
Aktivasi: ReLU
ReLU (Rectified Linear Unit) adalah fungsi aktivasi yang paling umum digunakan di CNN. Formula: f(x) = max(0, x). ReLU menghilangkan nilai negatif (mengubahnya jadi 0) dan mempertahankan nilai positif.
Perbandingan Arsitektur
| Arsitektur | Tahun | Layers | Parameters | Top-5 Acc (ImageNet) | Key Innovation |
|---|---|---|---|---|---|
| LeNet-5 | 1998 | 5 | 60K | ā | CNN pertama yang sukses |
| AlexNet | 2012 | 8 | 60M | 84.7% | ReLU, Dropout, GPU |
| VGG-16 | 2014 | 16 | 138M | 92.7% | 3Ć3 kernels, simplicity |
| GoogLeNet | 2014 | 22 | 6.8M | 93.3% | Inception module |
| ResNet-50 | 2015 | 50 | 25.6M | 96.4% | Skip connections |
| EfficientNet-B0 | 2019 | ā | 5.3M | 97.1% | Compound scaling |
7. Implementasi CNN dengan PyTorch
Sekawaran kita implementasi CNN lengkap untuk klasifikasi gambar menggunakan PyTorch pada dataset CIFAR-10 (10 kelas: airplane, automobile, bird, cat, deer, dog, frog, horse, ship, truck).
import torch
import torch.nn as nn
import torchvision.models as models
# =============================================
# TRANSFER LEARNING: Pre-trained ResNet-18
# =============================================
# Load pre-trained ResNet-18
model = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
print("=== Original ResNet-18 ===")
print(f"Total params: {sum(p.numel() for p in model.parameters()):,}")
# =============================================
# STRATEGY 1: Feature Extraction
# =============================================
# Freeze ALL convolution layers
for param in model.parameters():
param.requires_grad = False
# Replace classifier (final FC layer)
# ResNet-18 final layer: model.fc (512 ā 1000)
model.fc = nn.Sequential(
nn.Linear(512, 256),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, 10) # 10 classes for CIFAR-10
)
trainable_params = sum(p.numel() for p in model.parameters() if p.requires_grad)
total_params = sum(p.numel() for p in model.parameters())
print(f"\n=== After Feature Extraction ===")
print(f"Total params: {total_params:,}")
print(f"Trainable params: {trainable_params:,}")
print(f"Frozen params: {total_params - trainable_params:,}")
# =============================================
# STRATEGY 2: Fine-Tuning
# =============================================
model_ft = models.resnet18(weights=models.ResNet18_Weights.DEFAULT)
# Freeze early layers (layer1, layer2)
for name, param in model_ft.named_parameters():
if 'layer1' in name or 'layer2' in name:
param.requires_grad = False
# Unfreeze later layers (layer3, layer4) + FC
for name, param in model_ft.named_parameters():
if 'layer3' in name or 'layer4' in name:
param.requires_grad = True
# Replace FC
model_ft.fc = nn.Sequential(
nn.Linear(512, 256),
nn.ReLU(),
nn.Dropout(0.3),
nn.Linear(256, 10)
)
trainable_ft = sum(p.numel() for p in model_ft.parameters() if p.requires_grad)
print(f"\n=== After Fine-Tuning ===")
print(f"Trainable params: {trainable_ft:,}")
print(f"Frozen early layers: layer1, layer2")
print(f"Unfrozen: layer3, layer4, fc")
# =============================================
# DIFFERENT LEARNING RATES (LR Discriminative)
# =============================================
# Berikan learning rate berbeda per layer group
param_groups = [
{'params': [p for n, p in model_ft.named_parameters()
if 'layer1' in n or 'layer2' in n],
'lr': 1e-5}, # Frozen layer: very small LR (if any)
{'params': [p for n, p in model_ft.named_parameters()
if 'layer3' in n or 'layer4' in n],
'lr': 1e-4}, # Middle layers: small LR
{'params': model_ft.fc.parameters(),
'lr': 1e-3} # New layers: larger LR
]
optimizer_ft = torch.optim.Adam(param_groups, weight_decay=1e-4)
print("\n=== Discriminative Learning Rates ===")
print(" Early layers: 1e-5")
print(" Middle layers: 1e-4")
print(" FC layer: 1e-3")
9. Tips & Trik Praktis
- Data Augmentation wajib! ā Random flip, rotation, crop, color jitter. Ini meningkatkan generalisasi secara signifikan
- Gunakan Batch Normalization ā Setelah setiap conv layer. Mempercepat training dan bertindak sebagai regularizer
- Mulai dengan Transfer Learning ā Jangan bangun dari nol kecuali dataset sangat unik (misalnya medical imaging)
- Learning Rate Finder ā Mulai dari LR kecil, naikkan hingga loss meledak. Ambil LR 10Ć lebih kecil dari yang "meledak"
- Cosine Annealing ā LR scheduler yang menurunkan LR secara kosinus. Lebih baik dari step decay
- Global Average Pooling ā Ganti FC layers di akhir dengan GAP. Mengurangi parameter secara drastis
- Monitor overfitting ā Jika train acc naik tapi test acc stagnan ā terlalu sedikit data atau model terlalu kompleks
- Mixed Precision Training ā Gunakan float16 untuk mempercepat training di GPU (2-3Ć speedup)
10. Quiz: Uji Pemahamanmu!
Setelah membaca tutorial di atas, jawablah 5 pertanyaan berikut untuk menguji pemahamanmu tentang CNN: