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.
Rumus bentuk keluaran merangkum ketiganya. Untuk masukan berukuran , kernel , padding , dan stride , sisi keluaran berukuran:
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 , 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.
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:])}")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 kanal dan keluaran kanal menyimpan kernel berukuran , sehingga setiap filter keluaran menjumlahkan kontribusi semua kanal masukan. Perhitungan parameternya menjadi 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 , 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 parameter per layer.
- Bentuk tensor mengikuti urutan NCHW, dan mencetak bentuk sebelum layer pertama mencegah kesalahan urutan dimensi.
Referensi#
- Convolutional Networks — CS231n, Stanford — Catatan yang memuat rumus bentuk spasial dan aritmetika parameternya.
- torch.nn.Conv2d — PyTorch — Dokumentasi resmi yang menyatakan urutan dimensi NCHW dan rumus keluaran.
- Convolutions for Images — Dive into Deep Learning — Bab yang mendemonstrasikan padding dan stride dengan gambar nyata.