Argumen Langkah Tensorflow

115

Saya mencoba untuk memahami argumen langkah di tf.nn.avg_pool, tf.nn.max_pool, tf.nn.conv2d.

The dokumentasi berulang kali mengatakan

strides: Daftar int yang memiliki panjang> = 4. Langkah dari jendela geser untuk setiap dimensi tensor input.

Pertanyaan saya adalah:

  1. Apa yang diwakili oleh masing-masing dari 4+ bilangan bulat?
  2. Mengapa mereka harus memiliki langkah [0] = langkah [3] = 1 untuk konvnet?
  3. Dalam contoh ini kita lihat tf.reshape(_X,shape=[-1, 28, 28, 1]). Mengapa -1?

Sayangnya contoh di dokumen untuk membentuk kembali menggunakan -1 tidak diterjemahkan terlalu baik ke skenario ini.

jfbeltran.dll
sumber

Jawaban:

224

Operasi penggabungan dan konvolusional menggeser "jendela" melintasi tensor input. Menggunakan tf.nn.conv2dsebagai contoh: Jika tensor input memiliki 4 dimensi:, [batch, height, width, channels]maka konvolusi beroperasi pada jendela 2D pada height, widthdimensi tersebut.

stridesmenentukan 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.

dga
sumber
5
@ Derek karena (dari teks) "Kami akan memberikan konvolusi kedalaman saluran keluaran 8.". Itu adalah sesuatu yang dapat Anda pilih saat menyiapkan konvolusi, dan penjawab memilih 8.
etarion
17

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.

Rafał Józefowicz
sumber
11

Mari kita mulai dengan apa yang dilakukan langkah dalam casing 1-redup.

Mari asumsikan Anda input = [1, 0, 2, 3, 0, 1, 1]dan kernel = [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 :

  • 8 = 1 * 2 + 0 * 1 + 2 * 3
  • 11 = 0 * 2 + 2 * 1 + 3 * 3
  • 7 = 2 * 2 + 3 * 1 + 0 * 3
  • 9 = 3 * 2 + 0 * 1 + 1 * 3
  • 4 = 0 * 2 + 1 * 1 + 1 * 3

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:

masukkan deskripsi gambar di sini

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:

  1. Apa yang diwakili oleh masing-masing dari 4+ bilangan bulat? . konv2d , kumpulan memberi tahu Anda bahwa daftar ini mewakili langkah di antara setiap dimensi. Perhatikan bahwa panjang daftar langkah sama dengan peringkat tensor kernel.
  2. Mengapa mereka harus memiliki langkah [0] = langkah 3 = 1 untuk konvnet? . Dimensi pertama adalah ukuran batch, yang terakhir adalah saluran. Tidak ada gunanya melewatkan batch maupun saluran. Jadi Anda membuatnya 1. Untuk lebar / tinggi Anda bisa melewatkan sesuatu dan itu sebabnya mereka mungkin bukan 1.
  3. tf.reshape (_X, shape = [- 1, 28, 28, 1]). Mengapa -1? tf.reshape menyediakannya untuk Anda:

    Jika satu komponen bentuk adalah nilai khusus -1, ukuran dimensi tersebut dihitung sehingga ukuran total tetap konstan. Secara khusus, bentuk [-1] diratakan menjadi 1-D. Paling banyak satu komponen bentuk bisa -1.

Salvador Dali
sumber
2

@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 stridekerja 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]

input_shape[4] is the number of colour channels (RGB or whichever format it is extracted in)
input_shape[3] is the width of the image
input_shape[2] is the height of the image
input_shape[1] is the number of frames that have been lumped into 1 complete data
input_shape[0] is the number of lumped frames of images we have.

Di bawah ini adalah dokumentasi ringkasan tentang bagaimana langkah digunakan.

langkah: Daftar int yang memiliki panjang> = 5. Panjang tensor 1-D 5. Langkah jendela geser untuk setiap dimensi masukan. Harus punyastrides[0] = strides[4] = 1

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[0]=1 means that we do not want to skip any data in the batch 
strides[4]=1 means that we do not want to skip in the channel 

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!

berbatu-batu
sumber