Saat pertama membaca istilah “convolution”, saya langsung curiga ini matematika yang tidak akan pernah saya pahami. Kenyataannya konsepnya bisa dijelaskan dengan analogi yang sangat programmer: sliding window. CNN (Convolutional Neural Network) adalah arsitektur yang mendominasi computer vision selama bertahun-tahun, dan intinya cuma dua operasi: convolution untuk mendeteksi pola lokal, dan pooling untuk meringkas. Episode ini catatan saya membedah keduanya.
Masalah: Dense Layer Tidak Cocok untuk Gambar
Coba pikirkan gambar 224×224 piksel berwarna. Itu 224 × 224 × 3 = sekitar 150 ribu angka input. Kalau layer pertama kita dense penuh ke 1000 neuron, parameternya sudah 150 juta — hanya untuk layer pertama. Lebih parah lagi: dense layer buta terhadap posisi. Kucing di pojok kiri atas dan kucing di pojok kanan bawah adalah dua pola angka yang sama sekali berbeda baginya, padahal secara semantik sama.
Dua intuisi tentang gambar yang dilanggar dense layer: pola penting itu lokal (deteksi tepi tidak perlu melihat seluruh gambar), dan pola yang sama bisa muncul di mana saja. CNN dirancang persis untuk kedua sifat ini.
Convolution: Sliding Window Pendeteksi Pola
Convolution bekerja dengan filter kecil — misalnya 3×3 angka — yang digeser melewati seluruh gambar. Di setiap posisi, isi filter dikalikan elemen-per-elemen dengan area gambar di bawahnya lalu dijumlahkan jadi satu angka. Hasilnya disebut feature map: peta lokasi di mana pola tersebut ditemukan.
- Parameter sedikit: filter 3×3 punya hanya 9 bobot, dipakai ulang di seluruh gambar (weight sharing).
- Invarian posisi: filter yang sama mendeteksi tepi di pojok manapun.
- Hierarki otomatis: layer awal belajar tepi dan garis, layer tengah tekstur, layer dalam bentuk objek.
import numpy as np
img = np.array([
[0, 0, 0, 0, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 1, 1, 1, 0],
[0, 0, 0, 0, 0],
], dtype=float)
kernel = np.array([ # detektor tepi vertikal
[-1, 0, 1],
[-1, 0, 1],
[-1, 0, 1],
])
H, W = img.shape
out = np.zeros((H - 2, W - 2))
for i in range(H - 2):
for j in range(W - 2):
patch = img[i:i+3, j:j+3]
out[i, j] = np.sum(patch * kernel) # dot product lokal
print(out)
Kode di atas adalah convolution 2D yang ditulis manual tanpa library deep learning. Perhatikan loop ganda yang menggeser window 3×3 — itulah seluruh idenya. Di praktik, operasi ini dijalankan GPU pada ratusan filter sekaligus, tapi logikanya persis sama.
Pooling: Meringkas Tanpa Kehilangan Inti
Setelah convolution, biasanya diselingi pooling: mengecilkan ukuran feature map. Max pooling 2×2 mengambil nilai terbesar dari setiap blok 2×2, memotong dimensi menjadi seperempat. Manfaatnya: komputasi lebih murah, dan toleransi kecil terhadap pergeseran — objek yang bergeser satu-dua piksel tetap terdeteksi. Ada juga average pooling yang mengambil rata-rata, dan global average pooling yang sering dipakai sebagai pengganti flatten menjelang output.
| Blok | Tugas | Analogi |
|---|---|---|
| Convolution | Deteksi pola lokal via filter geser | Regex yang discan ke seluruh teks |
| Activation (ReLU) | Non-linearitas | Filter negatif dibuang |
| Pooling | Pengecilan ukuran, ringkasan | Downsampling / thumbnail |
| Stack berulang | Hierarki abstraksi | Abstraksi bertingkat ala software |
Arsitektur Klasik: Rangkaian Blok
Resep klasik CNN seperti VGG: tumpukan blok (convolution + ReLU) beberapa kali, diselingi max pooling, lalu diakhiri flatten atau global average pooling sebelum dense layer output. Keluarga ResNet menambahkan residual connection — jalur pintas yang menyambungkan output awal blok ke akhirnya — untuk membuat jaringan sangat dalam tetap bisa dilatih. Untuk pekerjaan sendiri, jangan menulis dari nol: pakai transfer learning, ambil model pretrained lalu fine-tune di data Anda.
Catatan penutup: dunia vision kini tidak lagi eksklusif milik CNN — Vision Transformer mulai mengambil alih di banyak benchmark. Tapi CNN tetap fondasi yang wajib dipahami: ringkas, efisien, dan intuisinya (filter geser + hierarki) terpakai sampai arsitektur modern sekalipun.
Komentar Terbaru