ā˜€ļøSiang
AI & Data Science

CNN: Convolutional Neural Networks

TOKEN Menengah

Tutorial lengkap CNN — convolution layers, pooling, padding & stride, arsitektur populer (LeNet, AlexNet, VGG, ResNet), image classification, dan implementasi dengan PyTorch

Artikel: Dl Cnn Image Artikel: Dl Cnn Image


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.

Diagram: Mengapa CNN Lebih Efisien
Mengapa CNN Lebih Efisien

CNN (Convolutional)

MLP (Dense)

Input 224Ɨ224Ɨ3\n= 150,528 params

Hidden Layer\n10,000 neurons

Output: 1000 classes

Input 224Ɨ224Ɨ3

Conv Layer\n3Ɨ3 kernel = 9 params\n(shared weights)

Output: 1000 classes

Aplikasi CNN

Aplikasi Contoh Kenapa CNN?
Image ClassificationLabel foto (kucing/anjing/mobil)Deteksi pola visual hierarkis
Object DetectionYOLO, Faster R-CNNDeteksi + lokalisasi objek dalam gambar
Semantic SegmentationU-Net (medical imaging)Klasifikasi setiap pixel
Face RecognitionFaceNet, DeepFaceFeature extraction wajah
Self-driving CarsTesla, WaymoDeteksi rambu, pejalan kaki, jalur
Medical ImagingDeteksi tumor, kankerPola abnormal pada X-ray/MRI
Text ClassificationSentiment analysis1D CNN untuk text
Video AnalysisAction recognition3D 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

Diagram: Operasi Convolution 3Ɨ3
Operasi Convolution 3Ɨ3

šŸ“· Input Image\n(5Ɨ5)

šŸ”§ 3Ɨ3 Kernel\n(Weight Sharing)

šŸ“Š Feature Map\n(3Ɨ3)

šŸ“‰ Pooling\n(downsample)

šŸ“¤ Output

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]]/16Memblur gambar (mengurangi noise)
Embassy[[-2,-1,0],[-1,1,1],[0,1,2]]Memberi efek 3D
Diagram

Input\n(5Ɨ5)

Padding\n(+1 each side)

Padded\n(7Ɨ7)

3Ɨ3 Conv

Output\n(5Ɨ5)

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

šŸ“ Rumus Kalkulasi 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Ɨ323Ɨ30130Ɨ30
Same padding32Ɨ323Ɨ31132Ɨ32
Downsample 2Ɨ32Ɨ323Ɨ31216Ɨ16
Large kernel28Ɨ285Ɨ50124Ɨ24
Same large kernel28Ɨ285Ɨ52128Ɨ28
Diagram

AVERAGE POOLING

4 2\n6 1

Avg: 3.25

MAX POOLING

4 2\n6 1

Max: 6

Jenis Pooling Operasi Kelebihan Penggunaan
Max PoolingAmbil nilai maksimum per regionPertahankan fitur kuatPaling umum (default)
Average PoolingAmbil rata-rata per regionSmooth, tidak kehilangan infoGlobal Average Pooling (akhir jaringan)
Global Average PoolingRata-rata SELURUH feature map → 1 nilai per channelSangat mengurangi parameterAkhir CNN sebelum classifier
Stochastic PoolingRandom sampling sesuai distribusiRegularisasiJarang digunakan


5. Arsitektur CNN Lengkap

Sebuah arsitektur CNN lengkap terdiri dari beberapa komponen yang bekerja bersama:

Struktur Umum CNN

Diagram: Arsitektur CNN Lengkap
Arsitektur CNN Lengkap

šŸ“· Image\n224Ɨ224

Conv1\n(32 filters)

Pool1

Conv2\n(64 filters)

Pool2

Conv3\n(128 filters)

Pool3

Flatten

Dense\n(256)

Output\n(10 classes)

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.

Diagram

1998: LeNet-5\n(LeCun)\n60K params

2012: AlexNet\n(Krizhevsky)\n60M params

2014: VGGNet\n(Simonyan)\n138M params

2014: GoogLeNet\n(Szegedy)\n6.8M params

2015: ResNet\n(He)\n25.6M params

2019: EfficientNet\n(Tan)\n5.3M params

Perbandingan Arsitektur

Arsitektur Tahun Layers Parameters Top-5 Acc (ImageNet) Key Innovation
LeNet-51998560K—CNN pertama yang sukses
AlexNet2012860M84.7%ReLU, Dropout, GPU
VGG-16201416138M92.7%3Ɨ3 kernels, simplicity
GoogLeNet2014226.8M93.3%Inception module
ResNet-5020155025.6M96.4%Skip connections
EfficientNet-B02019—5.3M97.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).

Diagram

🧠 Pre-trained Model\n(ImageNet, ResNet50)

Strategy 1: Feature Extractor\n• Freeze all layers\n• Train only classifier\n• Small dataset

Strategy 2: Fine-tuning\n• Unfreeze top layers\n• Low learning rate\n• Medium dataset

Strategy 3: Full Training\n• Train from scratch\n• Large dataset needed

Python — Transfer Learning dengan ResNet
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

šŸ’” Tips Terbaik untuk CNN
  • 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:

Pertanyaan 1: Mengapa CNN lebih efisien dari Fully Connected Network untuk memproses gambar?

a) CNN menggunakan GPU yang lebih cepat
b) CNN menggunakan parameter sharing dan local connectivity
c) CNN menghapus semua informasi dari gambar
d) CNN tidak perlu training

Pertanyaan 2: Apa fungsi utama dari Pooling Layer?

a) Menambah parameter pada model
b) Mengurangi ukuran spatial dan membuat fitur lebih robust
c) Menambah channel pada feature map
d) Menggabungkan fitur dari layer berbeda

Pertanyaan 3: Jika input 32Ɨ32, kernel 3Ɨ3, padding 1, stride 2, berapa ukuran output?

a) 32Ɨ32
b) 30Ɨ30
c) 16Ɨ16
d) 15Ɨ15

Pertanyaan 4: Inovasi utama ResNet adalah...

a) Menggunakan filter yang lebih besar (7Ɨ7)
b) Menghapus semua pooling layers
c) Residual (skip) connections yang mengatasi vanishing gradient
d) Menggunakan Sigmoid sebagai aktivasi

Pertanyaan 5: Transfer Learning paling cocok digunakan ketika...

a) Dataset sangat besar (jutaan gambar)
b) Dataset kecil dan tugas mirip dengan pre-training task
c) Model harus sangat cepat untuk inference
d) Tidak tersedia GPU untuk training
šŸ” Zoom
100%
šŸŽØ Tema