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.
Inputnya 4 dimensi dan berbentuk:
[batch_size, image_rows, image_cols, number_of_colors]
Langkah, secara umum, menentukan tumpang tindih antara operasi penerapan. Dalam kasus konv2d, ini menentukan berapa jarak antara aplikasi filter konvolusional yang berurutan. Nilai 1 dalam dimensi tertentu berarti kita menerapkan operator pada setiap baris / kolom, nilai 2 berarti setiap detik, dan seterusnya.
Re 1) Nilai yang penting untuk konvolusi adalah ke-2 dan ke-3 dan mewakili tumpang tindih dalam penerapan filter konvolusional di sepanjang baris dan kolom. Nilai [1, 2, 2, 1] menyatakan bahwa kita ingin menerapkan filter pada setiap baris dan kolom kedua.
Re 2) Saya tidak tahu batasan teknis (mungkin persyaratan CuDNN) tetapi biasanya orang menggunakan langkah di sepanjang dimensi baris atau kolom. Tidak selalu masuk akal untuk melakukannya di atas ukuran tumpukan. Tidak yakin dengan dimensi terakhir.
Re 3) Menetapkan -1 untuk salah satu sarana dimensi, "tetapkan nilai untuk dimensi pertama sehingga jumlah total elemen di tensor tidak berubah". Dalam kasus kami, -1 akan sama dengan batch_size.
sumber
Mari kita mulai dengan apa yang dilakukan langkah dalam casing 1-redup.
Mari asumsikan Anda
input = [1, 0, 2, 3, 0, 1, 1]
dankernel = [2, 1, 3]
hasil konvolusinya adalah[8, 11, 7, 9, 4]
, yang dihitung dengan menggeser kernel Anda ke atas input, melakukan perkalian elemen-bijaksana dan menjumlahkan semuanya. Seperti ini :Di sini kami menggeser satu elemen, tetapi tidak ada yang menghentikan Anda dengan menggunakan nomor lain. Angka ini adalah langkahmu. Anda dapat menganggapnya sebagai downsampling hasil dari konvolusi 1 langkah dengan hanya mengambil setiap hasil s-th.
Mengetahui ukuran input i , ukuran kernel k , langkah s dan padding p Anda dapat dengan mudah menghitung ukuran keluaran dari konvolusi sebagai:
Sini || operator berarti operasi langit-langit. Untuk lapisan penggabungan s = 1.
Casing N-redup.
Mengetahui matematika untuk kasing 1-dim, kasing n-dim menjadi mudah setelah Anda melihat bahwa setiap redup itu independen. Jadi Anda cukup menggeser setiap dimensi secara terpisah. Berikut adalah contoh untuk 2-d . Perhatikan bahwa Anda tidak perlu memiliki langkah yang sama di semua dimensi. Jadi untuk input / kernel N-dim Anda harus memberikan langkah N.
Jadi sekarang mudah untuk menjawab semua pertanyaan Anda:
sumber
@dga telah melakukan pekerjaan yang luar biasa dalam menjelaskan dan saya tidak bisa cukup bersyukur betapa bermanfaatnya itu. Dengan cara yang sama, saya ingin membagikan temuan saya tentang cara
stride
kerja dalam konvolusi 3D.Menurut dokumentasi TensorFlow di konv3d, bentuk masukan harus dalam urutan berikut:
[batch, in_depth, in_height, in_width, in_channels]
Mari kita jelaskan variabel dari ujung kanan ke kiri menggunakan sebuah contoh. Dengan asumsi bentuk masukan adalah
input_shape = [1000,16,112,112,3]
Di bawah ini adalah dokumentasi ringkasan tentang bagaimana langkah digunakan.
Seperti yang ditunjukkan dalam banyak karya, langkah berarti berapa banyak langkah dari jendela atau kernel yang melompat dari elemen terdekat, baik itu bingkai data atau piksel (ini diparafrasekan dengan cara).
Dari dokumentasi di atas, langkah dalam 3D akan terlihat seperti ini langkah = (1, X , Y , Z , 1).
Dokumentasi menekankan hal itu
strides[0] = strides[4] = 1
.strides [X] berarti berapa banyak lompatan yang harus kita lakukan dalam frame yang digabungkan. Jadi misalnya jika kita memiliki 16 frame, X = 1 berarti gunakan setiap frame. X = 2 berarti gunakan setiap frame detik dan seterusnya
langkah [y] dan langkah [z] ikuti penjelasan oleh @dga jadi saya tidak akan mengulang bagian itu.
Namun dalam keras, Anda hanya perlu menetapkan tupel / daftar 3 bilangan bulat, menentukan langkah konvolusi di sepanjang setiap dimensi spasial, di mana dimensi spasial adalah langkah [x], langkah [y] dan langkah [z]. strides [0] dan step [4] sudah default ke 1.
Saya harap seseorang menemukan ini bermanfaat!
sumber