Dalam jaringan saraf convolutional (CNN), ketika membelit gambar, apakah operasi menggunakan produk titik atau jumlah perkalian elemen-bijaksana?

12

Contoh di bawah ini diambil dari kuliah di deeplearning.ai menunjukkan bahwa hasilnya adalah jumlah dari produk elemen demi elemen (atau "perkalian elemen-bijaksana". Angka merah mewakili bobot dalam filter:

(11)+(10)+(11)+(00)+(11)+(10)+(01)+(00)+(11)=1+0+1+0+1+0+0+0+1=4

masukkan deskripsi gambar di sini

NAMUN, sebagian besar sumber daya mengatakan bahwa itu adalah produk titik yang digunakan:

"... kita dapat mengekspresikan kembali output dari neuron sebagai, di mana istilah bias. Dengan kata lain, kita dapat menghitung output dengan y = f (x * w) di mana b adalah istilah bias. Dengan kata lain, kita dapat menghitung output dengan melakukan produk titik dari vektor input dan bobot, menambahkan istilah bias untuk menghasilkan logit, dan kemudian menerapkan fungsi transformasi. "

Buduma, Nikhil; Locascio, Nicholas. Fundamentals of Deep Learning: Merancang Algoritma Kecerdasan Mesin Generasi Selanjutnya (hlm. 8). O'Reilly Media. Edisi menyalakan.

"Kami mengambil filter 5 * 5 * 3 dan menggesernya di atas gambar lengkap dan sepanjang jalan mengambil produk titik antara filter dan potongan gambar input. Untuk setiap produk titik yang diambil, hasilnya adalah skalar."

https://medium.com/technologymadeeasy/the-best-explanation-of-convolutional-neural-networks-on-the-internet-fbb8b1ad5df8

"Setiap neuron menerima beberapa input, melakukan dot produk dan secara opsional mengikutinya dengan non-linearitas."

http://cs231n.github.io/convolutional-networks/

"Hasil konvolusi sekarang setara dengan melakukan satu matriks besar, kalikan np.dot (W_row, X_col), yang mengevaluasi produk titik antara setiap filter dan setiap lokasi bidang reseptif."

http://cs231n.github.io/convolutional-networks/

Namun, ketika saya meneliti bagaimana menghitung produk titik dari matrik , tampaknya produk titik tidak sama dengan menjumlahkan perkalian elemen demi elemen. Operasi apa yang sebenarnya digunakan (perkalian elemen demi elemen atau produk titik?) Dan apa perbedaan utama?

Ryan Chase
sumber
1
Produk dot tidak akurat. Saya akan mengatakan itu jumlah dari Hadamard productarea yang dipilih dan kernel konvolusi.
JP Zhang
ini adalah produk titik tetapi alih-alih menggunakan seluruh matriks jumlah tambalan yang dipindahkan, jadi kita tidak bisa menggunakan fungsi produk titik karena kita harus mengulang-ulang matriks yang berbeda untuk memindahkan tambalan / jendela di sekitar semua gambar / matriks
Mr-Program

Jawaban:

13

Setiap lapisan yang diberikan dalam CNN biasanya memiliki 3 dimensi (kami akan menyebutnya tinggi, lebar, kedalaman). Konvolusi akan menghasilkan layer baru dengan tinggi, lebar dan kedalaman baru (atau sama). Namun operasi dilakukan berbeda pada ketinggian / lebar dan berbeda pada kedalaman dan ini yang saya pikir menyebabkan kebingungan.

Pertama mari kita lihat bagaimana operasi konvolusi pada ketinggian dan lebar matriks input. Kasing ini dilakukan persis seperti yang digambarkan dalam gambar Anda dan pastinya merupakan perkalian elemen-bijaksana dari dua matriks .

Secara teori :
konvolusi dua dimensi (diskrit) dihitung dengan rumus di bawah ini:

C[m,n]=kamukamuSEBUAH[m+kamu,n+kamu]B[kamu,kamu]

Seperti yang Anda lihat setiap elemen dihitung sebagai jumlah dari produk-produk dari satu elemen dari dengan satu elemen dari . Ini berarti bahwa setiap elemen dari dihitung dari jumlah dari perkalian elemen-bijaksana dari dan .CSEBUAHBCSEBUAHB

Dalam praktiknya :
Anda dapat menguji contoh di atas dengan sejumlah paket (saya akan menggunakan scipy ):

import numpy as np
from scipy.signal import convolve2d

A = np.array([[1,1,1,0,0],[0,1,1,1,0],[0,0,1,1,1],[0,0,1,1,0],[0,1,1,0,0]])
B = np.array([[1,0,1],[0,1,0],[1,0,1]])
C = convolve2d(A, B, 'valid')
print(C)

Kode di atas akan menghasilkan:

[[4 3 4]
 [2 4 3]
 [2 3 4]]

Sekarang, operasi konvolusi pada kedalaman input sebenarnya dapat dianggap sebagai produk titik karena setiap elemen dengan tinggi / lebar yang sama dikalikan dengan bobot yang sama dan mereka dijumlahkan bersama. Ini paling jelas dalam kasus konvolusi 1x1 (biasanya digunakan untuk memanipulasi kedalaman lapisan tanpa mengubah dimensi itu). Namun, ini bukan bagian dari konvolusi 2D (dari sudut pandang matematika) tetapi sesuatu yang dilakukan oleh lapisan konvolusional di CNN.

Catatan :
1: Itu dikatakan saya pikir sebagian besar sumber yang Anda berikan memiliki penjelasan yang menyesatkan untuk sedikitnya dan tidak benar. Saya tidak menyadari begitu banyak sumber salah operasi ini (yang merupakan operasi paling penting dalam CNN). Saya kira itu ada hubungannya dengan fakta bahwa konvolusi menjumlahkan produk antara skalar dan produk antara dua skalar juga disebut produk titik .
2: Saya pikir referensi pertama merujuk pada layer Fully Connected daripada layer Convolutional. Jika itu yang terjadi, lapisan FC melakukan produk titik seperti yang dinyatakan. Saya tidak memiliki sisa konteks untuk mengkonfirmasi ini.

tl; dr Gambar yang Anda berikan adalah 100% benar tentang cara operasi dilakukan, namun ini bukan gambar lengkap. Lapisan CNN memiliki 3 dimensi, dua di antaranya ditangani seperti yang digambarkan. Saran saya adalah untuk memeriksa bagaimana lapisan convolutional menangani kedalaman input (kasus paling sederhana yang bisa Anda lihat adalah konvolusi 1x1).

Djib2011
sumber
terima kasih atas tanggapannya. Per saran Anda tentang meneliti bagaimana lapisan convolutional menangani kedalaman input- lihat bagian Demo Konvolusi di tautan ini: cs231n.github.io/convolutional-networks . Saya menghitung angka-angka dalam spreadsheet dan nampak bahwa angka terakhir yang masuk dalam volume output hanyalah jumlah dari perkalian elemen-bijaksana dari setiap filter dan bidang reseptif (yang menjumlahkan ke satu nomor per volume warna), dan kemudian tiga angka baru saja ditambahkan bersama dengan bias ...
Ryan Chase
5
Ya yang ingin saya tunjukkan adalah bahwa ini setara dengan produk titik antara vektor piksel sepanjang dimensi ketiga (kedalaman, filter menyebutnya apa yang Anda inginkan) dan bobot skalar dari kernel konvolusi.
Djib2011
3

Operasi ini disebut konvolusi yang melibatkan penjumlahan elemen demi elemen, yang pada gilirannya sama dengan produk titik pada matriks multidimensi yang oleh orang-orang ML disebut tensor. Jika Anda menulisnya sebagai loop, itu akan terlihat seperti kode Python semu ini:

for i in 0:3:
  for j in 0:3:
    s = 0
    for k in 0:3:
      for l in 0:3:
        s += A[i+k,j+l]*C[k,l]
    Z[i,j] = s

Di sini A adalah matriks input 5x5 Anda, C adalah filter 3x3 dan Z adalah matriks output 3x3.

Perbedaan halus dengan produk titik adalah bahwa biasanya produk titik ada di seluruh vektor, sementara dalam konvolusi Anda mengerjakan produk titik pada subset bergerak (jendela) dari matriks input, Anda dapat menuliskannya sebagai berikut untuk mengganti dua sarang yang paling dalam yang bersarang. loop dalam kode di atas:

Z[i,j] = dot(A[i:i+2,j:j+2],C)
Aksakal
sumber
1

Saya percaya kuncinya adalah bahwa ketika filter menggabungkan beberapa bagian dari gambar ("bidang reseptif") setiap angka dalam filter (yaitu masing-masing berat) pertama-tama diratakan ke dalam format vektor . Demikian juga, piksel gambar juga diratakan ke dalam format vektor . MAKA, produk titik dihitung. Yang sama persis dengan menemukan penjumlahan dari perkalian elemen-demi-elemen (elemen-bijaksana).

Tentu saja, vektor-vektor yang diratakan ini juga dapat digabungkan dalam format matriks, seperti yang ditunjukkan gambar di bawah ini. Dalam hal ini maka perkalian matriks yang benar dapat digunakan, tetapi penting untuk dicatat bahwa perataan piksel gambar dari setiap konvolusi dan juga filter bobot adalah prekursor.

masukkan deskripsi gambar di sini

kredit gambar: Pembelajaran TensorFlow dan Deep tanpa gelar PhD, Bagian 1 (Google Cloud Next '17)

Ryan Chase
sumber
0

Baik interpretasi elemen-bijaksana dan titik produk benar. Saat Anda menggabungkan dua tensor, X bentuk (h, w, d) dan Y bentuk (h, w, d), Anda melakukan penggandaan elemen-bijaksana. Namun, itu sama dengan produk titik X dan Y transpos. Anda dapat memperluas persamaan matematika, bentuk, dan kecocokan subskrip.

pengguna2065639
sumber