Mekanika konvolusi

Kernel, stride, padding, dan perhitungan shape keluaran.

Daftar isi

Mekanika konvolusi menentukan bentuk keluaran melalui tiga pengatur, yaitu ukuran kernel, stride, dan padding. Topik ini mendefinisikan ketiganya, menurunkan rumus bentuk keluaran yang dipakai setiap hari oleh praktisi, dan menghitungnya bersama tensor sungguhan pada setiap kombinasi. Setelah selesai, perhitungan bentuk pada nn.Conv2d berhenti menjadi tebakan dan menjadi aritmetika yang pasti.

Tiga pengatur dan maknanya#

Kernel adalah jendela filter yang meluncur di atas masukan, dan ukurannya menentukan wilayah lokal yang dilihat sekaligus, misalnya 3x3 atau 5x5. Stride adalah panjang lompatan per geseran, sehingga stride 2 menggandakan penghematan ruang keluaran dengan harga kehalusan posisi. Padding adalah garis nilai nol yang ditambahkan di tepi masukan agar filter tetap dapat mengunjungi piksel tepi, dan padding yang tepat menjaga keluaran tetap seukuran masukan, yaitu kasus same yang lazim dipakai jaringan modern.

Diagram berikut memperlihatkan cara filter 3x3 meluncur pada masukan 5x5 dengan stride 1 dan tanpa padding, sehingga posisi yang dihasilkan terlihat jelas.

masukan 5x5posisi filter 3x3stride 1peta fitur 3x3satu nilai keluaranper posisi filterk=3, s=2dengan stride 2n_out = 2
Filter 3x3 meluncur pada masukan 5x5 dengan stride 1 tanpa padding dan menghasilkan peta 3x3

Rumus bentuk keluaran merangkum ketiganya. Untuk masukan berukuran n n , kernel k k , padding p p , dan stride s s , sisi keluaran berukuran:

nout=⌊n+2p−ks⌋+1 n_{\text{out}} = \left\lfloor \frac{n + 2p - k}{s} \right\rfloor + 1

Bagian bilangan bulat bawah pada rumus itu bermakna praktis, yaitu geseran terakhir yang belum menjangkau seluruh kernel dibuang. Karena itu masukan 5 dengan kernel 3 dan stride 2 menghasilkan ⌊(5−3)/2⌋+1=2 \lfloor (5-3)/2 \rfloor + 1 = 2 , bukan 2,5, dan piksel paling kanan tidak pernah dilihat oleh posisi kedua yang lengkap.

Menghitung bentuk dengan tensor sungguhan#

Rumus di atas dapat diverifikasi pada setiap kombinasi dengan satu cuplikan. Kode berikut membangun nn.Conv2d dengan pengatur berbeda dan mencetak bentuk keluarannya untuk masukan batch berisi satu citra satu kanal berukuran 5x5.

python Contoh: bentuk keluaran untuk setiap kombinasi pengatur
import torch
import torch.nn as nn

x = torch.randn(1, 1, 5, 5)
for k, s, p in ((3, 1, 0), (3, 1, 1), (3, 2, 0), (5, 2, 2)):
    konv = nn.Conv2d(1, 1, kernel_size=k, stride=s, padding=p)
    keluar = konv(x)
    print(f"k={k} s={s} p={p}: masukan {tuple(x.shape[-2:])} -> keluaran {tuple(keluar.shape[-2:])}")
text Keluaran
k=3 s=1 p=0: masukan (5, 5) -> keluaran (3, 3)
k=3 s=1 p=1: masukan (5, 5) -> keluaran (5, 5)
k=3 s=2 p=0: masukan (5, 5) -> keluaran (2, 2)
k=5 s=2 p=2: masukan (5, 5) -> keluaran (3, 3)

Keempat baris keluaran dapat diperiksa satu per satu dengan rumus. Kombinasi k 3 s 1 p 0 memberi 3, dan kombinasi k 3 s 1 p 1 memberi 5 karena padding mengembalikan ukuran masukan. Kombinasi k 3 s 2 p 0 memberi 2 sesuai perhitungan bilangan bulat bawah, sedangkan k 5 s 2 p 2 kembali memberi 5, yang menjadi pola same untuk kernel ganjil. Perhatikan bahwa jumlah kanal keluaran bukan hasil rumus ini, melainkan jumlah filter yang ditetapkan, dan setiap filter bekerja pada seluruh kanal masukan sekaligus.

Kanal, batch, dan konvensi bentuk PyTorch#

Bentuk tensor citra pada PyTorch mengikuti urutan NCHW, yaitu batch, kanal, tinggi, dan lebar, dan seluruh pembahasan di atas berlaku per kanal masukan. Layer konvolusi dengan masukan Cin C_{\text{in}} kanal dan keluaran Cout C_{\text{out}} kanal menyimpan kernel berukuran Cout×Cin×k×k C_{\text{out}} \times C_{\text{in}} \times k \times k , sehingga setiap filter keluaran menjumlahkan kontribusi semua kanal masukan. Perhitungan parameternya menjadi Cout⋅(Cin⋅k⋅k+1) C_{\text{out}} \cdot (C_{\text{in}} \cdot k \cdot k + 1) dengan bias, dan angka ini dibutuhkan pada topik Arsitektur klasik ketika resepnya dihitung.

Kesalahan bentuk paling umum pada pemakaian pertama adalah salah urutan dimensi, misalnya memberikan tensor berbentuk HWC alih-alih NCHW, dan gejalanya bukan error melainkan keluaran dengan ukuran yang tak masuk akal. Kebiasaan mencetak x.shape sebelum layer konvolusi pertama, sebagaimana dilatih ritual pada modul Disiplin pelatihan, menutup sebagian besar kekeliruan semacam ini.

Dari bentuk ke desain#

Rumus bentuk keluaran bukan sekadar alat cek, melainkan alat desain. Menetapkan kedalaman peta fitur dan ukurannya pada setiap layer berarti menetapkan biaya komputasi dan memori jaringan, karena jumlah operasi konvolusi tumbuh sebanding dengan hasil kali tinggi, lebar, dan kanalnya. Jaringan modern mengecilkan ukuran spasial sambil memperbanyak kanal seiring kedalaman, dan keseimbangan itu dirancang lewat rumus yang sama.

Topik Pooling melanjutkan cerita pengecilan ini dengan operasi yang khusus dirancang untuknya, sedangkan arsitektur klasik memperlihatkan bagaimana rumus ini menghasilkan resep yang dipakai bertahun-tahun.

Ringkasan#

  • Kernel, stride, dan padding menentukan bentuk keluaran melalui ⌊(n+2p−k)/s⌋+1 \lfloor (n + 2p - k)/s \rfloor + 1 , dan bagian bilangan bulat bawahnya membuang geseran yang tidak lengkap.
  • Padding 1 pada kernel 3 dengan stride 1 menjaga ukuran masukan, dan pola inilah yang dipakai jaringan modern sebagai kasus same.
  • Kanal masukan dan keluaran menentukan ukuran matriks bobot, yaitu Cout⋅(Cin⋅k⋅k+1) C_{\text{out}} \cdot (C_{\text{in}} \cdot k \cdot k + 1) parameter per layer.
  • Bentuk tensor mengikuti urutan NCHW, dan mencetak bentuk sebelum layer pertama mencegah kesalahan urutan dimensi.

Referensi#