Pemahaman saya adalah bahwa lapisan convolutional dari jaringan saraf convolutional memiliki empat dimensi: input_channels, filter_height, filter_width, number_of_filters. Lebih jauh, ini adalah pemahaman saya bahwa setiap filter baru akan berbelit-belit di atas SEMUA input_channels (atau fitur / peta aktivasi dari lapisan sebelumnya).
NAMUN, grafik di bawah ini dari CS231 menunjukkan setiap filter (berwarna merah) diterapkan pada SINGLE CHANNEL, daripada filter yang sama digunakan di seluruh saluran. Ini sepertinya menunjukkan bahwa ada filter terpisah untuk setiap saluran (dalam hal ini saya mengasumsikan mereka adalah tiga saluran warna dari gambar input, tetapi hal yang sama berlaku untuk semua saluran input).
Ini membingungkan - apakah ada filter unik berbeda untuk setiap saluran input?
Sumber: http://cs231n.github.io/convolutional-networks/
Gambar di atas tampaknya bertentangan dengan kutipan dari "Fundamentals of Deep Learning" O'reilly :
"... filter tidak hanya beroperasi pada satu peta fitur. Mereka beroperasi pada seluruh volume peta fitur yang telah dihasilkan pada lapisan tertentu ... Akibatnya, peta fitur harus dapat beroperasi lebih dari volume, bukan hanya daerah "
... Selain itu, menurut pemahaman saya bahwa gambar-gambar di bawah ini menunjukkan filter SAMA SAMA hanya berbelit-belit di ketiga saluran input (bertentangan dengan apa yang ditampilkan dalam gambar CS231 di atas):
Jawaban:
Mantan. Sebenarnya ada kernel terpisah yang ditentukan untuk setiap saluran input / kombinasi saluran keluaran.
Biasanya untuk arsitektur CNN, dalam satu filter seperti yang dijelaskan oleh
number_of_filters
parameter Anda , ada satu kernel 2D per saluran input. Adainput_channels * number_of_filters
set bobot, yang masing-masing menggambarkan kernel konvolusi. Jadi diagram yang menunjukkan satu set bobot per saluran input untuk setiap filter sudah benar. Diagram pertama juga menunjukkan dengan jelas bahwa hasil penerapan kernel tersebut digabungkan dengan menjumlahkannya dan menambahkan bias untuk setiap saluran keluaran.Ini juga dapat dilihat sebagai menggunakan konvolusi 3D untuk setiap saluran keluaran, yang kebetulan memiliki kedalaman yang sama dengan input. Itulah yang ditunjukkan diagram kedua Anda, dan juga apa yang akan dilakukan banyak perpustakaan secara internal. Secara matematis ini adalah hasil yang sama (asalkan kedalaman benar-benar cocok), meskipun jenis lapisan biasanya diberi label sebagai "Conv2D" atau serupa. Demikian pula jika jenis input Anda secara inheren 3D, seperti voxels atau video, maka Anda mungkin menggunakan lapisan "Conv3D", tetapi secara internal itu bisa diimplementasikan sebagai konvolusi 4D.
sumber
input_channels
versi dengan bobot berbeda . Apakah Anda memiliki sumber "resmi" yang menegaskan pemahaman ini?Gambar berikut yang Anda gunakan dalam pertanyaan Anda, sangat akurat menggambarkan apa yang terjadi. Ingat bahwa setiap elemen filter 3D (kubus abu-abu) terdiri dari nilai (
3x3x3=27
nilai) yang berbeda. Jadi, tiga filter 2D ukuran yang berbeda3x3
dapat digabungkan untuk membentuk filter ukuran 3D yang satu ini3x3x3
.The
3x3x3
RGB potongan dari gambar yang dikalikan elementwise oleh penyaring 3D (ditampilkan sebagai abu-abu). Dalam hal ini, filter memiliki3x3x3=27
bobot. Ketika bobot ini dikalikan elemen bijak dan kemudian dijumlahkan, itu memberi satu nilai.Jadi, apakah ada filter terpisah untuk setiap saluran input?
IYA NIH , ada filter 2D sebanyak jumlah saluran input dalam gambar. Namun , ada baiknya jika Anda berpikir bahwa untuk matriks input dengan lebih dari satu saluran, hanya ada satu filter 3D (seperti yang ditunjukkan pada gambar di atas).
Lalu mengapa ini disebut konvolusi 2D (jika filter adalah 3D dan matriks input adalah 3D)?
Ini adalah konvolusi 2D karena langkah filter adalah sepanjang dimensi tinggi dan lebar saja ( BUKAN kedalaman) dan oleh karena itu, output yang dihasilkan oleh konvolusi ini juga merupakan matriks 2D. Jumlah arah gerakan filter menentukan dimensi konvolusi.
Catatan: Jika Anda membangun pemahaman Anda dengan memvisualisasikan filter 3D tunggal alih-alih banyak filter 2D (satu untuk setiap layer), maka Anda akan dengan mudah memahami arsitektur CNN canggih seperti Resnet, InceptionV3, dll.
sumber
input_channels
versi dengan bobot berbeda . Jika ini juga pengertian Anda, apakah ada sumber "resmi" yang mengkonfirmasi hal ini?Saya menindaklanjuti jawaban di atas dengan contoh konkret dengan harapan untuk lebih memperjelas bagaimana konvolusi bekerja sehubungan dengan saluran input dan output dan bobot, masing-masing:
Biarkan contohnya sebagai berikut (wrt to 1 layer convolutional):
input_channels=5
output_channels=56
Kami mencatat bahwa:
Lapisan konvolusional demikian mengandung:
56 filter 3 dimensi dengan ukuran 4x4x5 (= 80 masing-masing bobot berbeda) untuk memperhitungkan 56 saluran output di mana masing-masing memiliki nilai untuk dimensi 3 dari 5 agar cocok dengan 5 saluran input. Total ada
number_of_filters=input_channel*output_channels=5*56=280
Filter 2D ukuran 4x4 (yaitu 280x16 bobot berbeda total).
sumber
Hanya ada batasan dalam 2D. Mengapa?
Bayangkan sebuah lapisan yang terhubung sepenuhnya.
Ini akan sangat besar, setiap neuron akan terhubung ke mungkin 1000x1000x3 input neuron. Tetapi kita tahu bahwa memproses piksel terdekat itu masuk akal, oleh karena itu kami membatasi diri pada lingkungan 2D kecil, sehingga setiap neuron terhubung ke hanya 3x3 dekat neuron dalam 2D. Kami tidak tahu hal seperti itu tentang saluran, jadi kami terhubung ke semua saluran.
Tetap saja, akan ada terlalu banyak bobot. Tetapi karena invarian terjemahan, filter yang berfungsi dengan baik di satu area paling mungkin berguna di area yang berbeda. Jadi kami menggunakan set bobot yang sama untuk 2D. Sekali lagi, tidak ada invarian terjemahan seperti itu di antara saluran, jadi tidak ada batasan seperti itu di sana.
sumber
Lihat bagian "Konektivitas Lokal" di http://cs231n.github.io/convolutional-networks/ dan geser 7-18.
Hyperparameter "Bidang Reseptif" filter hanya ditentukan oleh tinggi & lebar, karena kedalaman ditetapkan dengan mendahului kedalaman lapisan.
CATATAN bahwa "Tingkat konektivitas di sepanjang sumbu kedalaman selalu sama dengan KEDALAMAN volume input" -atau- KEDALAMAN peta aktivasi (jika lapisan berikutnya).
Secara intuitif, ini harus karena fakta bahwa data saluran gambar disisipkan, bukan planar. Dengan cara ini, menerapkan filter dapat dicapai hanya dengan penggandaan vektor kolom.
CATATAN bahwa Jaringan Konvolusional mempelajari semua parameter filter (termasuk dimensi kedalaman) dan semuanya " hw input_layer_depth + 1 (bias)" total .
sumber
Saya merekomendasikan bab 2.2.1 dari tesis master saya sebagai jawaban. Untuk menambah jawaban yang tersisa:
Keras adalah teman Anda untuk memahami apa yang terjadi:
memberi
Cobalah untuk merumuskan opsi Anda. Apa artinya bagi parameter jika ada hal lain yang terjadi?
Pendekatan ini juga membantu Anda dengan jenis lapisan lainnya, tidak hanya lapisan konvolusional.
Harap perhatikan juga bahwa Anda bebas menerapkan solusi yang berbeda, yang mungkin memiliki sejumlah parameter lainnya.
sumber
Hanya untuk membuat dua detail benar-benar jelas:
Cara termudah untuk meyakinkan diri sendiri tentang hal ini adalah membayangkan apa yang terjadi dalam skenario lain dan melihat bahwa perhitungannya menjadi merosot - yaitu, jika Anda tidak melakukan interleave dan menggabungkan kembali hasilnya, maka output yang berbeda tidak akan benar-benar melakukan apa pun - mereka akan memiliki efek yang sama dengan output tunggal dengan bobot gabungan.
sumber
Bagi siapa pun yang mencoba memahami bagaimana konvolusi dihitung, berikut ini cuplikan kode yang berguna di Pytorch:
Menjalankan ini memberikan output sebagai berikut:
Perhatikan bagaimana setiap saluran konvolusi merangkum semua output saluran sebelumnya.
sumber