Operasi penggabungan dan konvolusional menggeser "jendela" melintasi tensor input. Menggunakan tf.nn.conv2d
sebagai contoh: Jika tensor input memiliki 4 dimensi:, [batch, height, width, channels]
maka konvolusi beroperasi pada jendela 2D pada height, width
dimensi tersebut.
strides
menentukan seberapa banyak jendela bergeser di setiap dimensi. Penggunaan tipikal menyetel langkah pertama (kelompok) dan terakhir (kedalaman) ke 1.
Mari kita gunakan contoh yang sangat konkret: Menjalankan konvolusi 2-d pada gambar masukan skala abu-abu 32x32. Saya mengatakan abu-abu karena gambar input memiliki kedalaman = 1, yang membuatnya tetap sederhana. Biarkan gambar itu terlihat seperti ini:
00 01 02 03 04 ...
10 11 12 13 14 ...
20 21 22 23 24 ...
30 31 32 33 34 ...
...
Mari kita jalankan jendela konvolusi 2x2 di atas satu contoh (ukuran tumpukan = 1). Kami akan memberikan konvolusi kedalaman saluran keluaran 8.
Masukan ke konvolusi memiliki shape=[1, 32, 32, 1]
.
Jika Anda menentukan strides=[1,1,1,1]
dengan padding=SAME
, maka output dari filter akan menjadi [1, 32, 32, 8].
Filter pertama-tama akan membuat keluaran untuk:
F(00 01
10 11)
Dan kemudian untuk:
F(01 02
11 12)
dan seterusnya. Kemudian akan pindah ke baris kedua, menghitung:
F(10, 11
20, 21)
kemudian
F(11, 12
21, 22)
Jika Anda menentukan langkah [1, 2, 2, 1] itu tidak akan melakukan jendela yang tumpang tindih. Ini akan menghitung:
F(00, 01
10, 11)
lalu
F(02, 03
12, 13)
Langkah ini beroperasi serupa untuk operator penggabungan.
Pertanyaan 2: Mengapa langkah [1, x, y, 1] untuk konvnet
Yang pertama adalah kelompok: Anda biasanya tidak ingin melewatkan contoh dalam kelompok Anda, atau Anda tidak boleh menyertakannya di tempat pertama. :)
Yang terakhir adalah kedalaman konvolusi: Anda biasanya tidak ingin melewatkan input, karena alasan yang sama.
Operator konv2 lebih umum, sehingga Anda dapat membuat konvolusi yang menggeser jendela di sepanjang dimensi lain, tetapi itu bukan penggunaan biasa di konvnet. Penggunaan tipikal adalah menggunakannya secara spasial.
Mengapa membentuk ulang menjadi -1 -1 adalah placeholder yang mengatakan "sesuaikan seperlunya untuk mencocokkan ukuran yang diperlukan untuk tensor penuh". Ini adalah cara untuk membuat kode menjadi independen dari ukuran batch input, sehingga Anda dapat mengubah pipeline Anda dan tidak perlu menyesuaikan ukuran batch di mana pun dalam kode.