Apa perbedaan antara 'SAMA' dan padding 'VALID' di tf.nn.max_pool
dari tensorflow
?
Menurut pendapat saya, 'VALID' berarti tidak akan ada bantalan nol di luar tepi ketika kita melakukan max pool.
Menurut A guide to convolution arithmetic untuk pembelajaran mendalam , dikatakan bahwa tidak akan ada padding pada operator pool, yaitu cukup gunakan 'VALID' dari tensorflow
. Tapi apa yang dimaksud dengan 'SAMPAIAN' max pool tensorflow
?
python
tensorflow
deep-learning
karl_TUM
sumber
sumber
Jawaban:
Saya akan memberikan contoh untuk membuatnya lebih jelas:
x
: masukan gambar bentuk [2, 3], 1 saluranvalid_pad
: max pool dengan kernel 2x2, stride 2 dan VALID padding.same_pad
: max pool dengan kernel 2x2, stride 2 dan SAMA padding (ini adalah cara klasik untuk pergi)Bentuk output adalah:
valid_pad
: di sini, tidak ada bantalan sehingga bentuk output adalah [1, 1]same_pad
: di sini, kami menempelkan gambar ke bentuk [2, 4] (dengan-inf
dan kemudian menerapkan max pool), jadi bentuk keluaran adalah [1, 2]sumber
Jika Anda suka ascii art:
"VALID"
= tanpa bantalan:"SAME"
= dengan nol bantalan:Dalam contoh ini:
Catatan:
"VALID"
hanya pernah menjatuhkan kolom paling kanan (atau baris paling bawah)."SAME"
mencoba untuk pad secara merata kiri dan kanan, tetapi jika jumlah kolom yang akan ditambahkan adalah aneh, itu akan menambahkan kolom tambahan ke kanan, seperti halnya dalam contoh ini (logika yang sama berlaku secara vertikal: mungkin ada baris tambahan dari nol di bagian bawah).Edit :
Tentang namanya:
"SAME"
padding, jika Anda menggunakan langkah 1, output layer akan memiliki dimensi spasial yang sama dengan inputnya."VALID"
padding, tidak ada input padding "buatan". Lapisan hanya menggunakan data input yang valid .sumber
-inf
.Kapan
stride
1 (lebih tipikal dengan konvolusi daripada pooling), kita dapat memikirkan perbedaan berikut:"SAME"
: ukuran output sama dengan ukuran input. Ini membutuhkan jendela filter untuk menyelinap keluar input peta, maka perlu pad."VALID"
: Jendela filter tetap pada posisi yang valid di dalam peta input, sehingga ukuran output menyusutfilter_size - 1
. Tidak ada bantalan terjadi.sumber
SAME
danVALID
mungkin juga telah dipanggilfoo
danbar
The TensorFlow Konvolusi contoh memberikan gambaran tentang perbedaan antara
SAME
danVALID
:Untuk
SAME
padding, tinggi dan lebar output dihitung sebagai:Dan
Untuk
VALID
padding, tinggi dan lebar output dihitung sebagai:sumber
Padding adalah operasi untuk menambah ukuran data input. Dalam hal data 1-dimensi Anda hanya menambahkan / menambahkan array dengan konstanta, dalam 2-dim Anda mengelilingi matriks dengan konstanta ini. Dalam n-redup Anda mengelilingi hypercube n-redup dengan konstanta. Dalam sebagian besar kasus, konstanta ini adalah nol dan disebut zero-padding.
Berikut adalah contoh zero-padding dengan
p=1
diterapkan pada tensor 2-d:Anda dapat menggunakan padding sewenang-wenang untuk kernel Anda tetapi beberapa nilai padding digunakan lebih sering daripada yang lain:
k
k
, padding ini sama dengank - 1
.Untuk menggunakan padding sewenang-wenang dalam TF, Anda dapat menggunakan
tf.pad()
sumber
Penjelasan Cepat
VALID
: Jangan gunakan bantalan apa pun, mis., Asumsikan bahwa semua dimensi valid sehingga gambar input sepenuhnya tercakup oleh filter dan langkah yang Anda tentukan.SAME
: Terapkan padding ke input (jika perlu) sehingga gambar input sepenuhnya tertutup oleh filter dan langkah yang Anda tentukan. Untuk langkah 1, ini akan memastikan bahwa ukuran gambar output sama dengan input.Catatan
NO_PADDING
sebagai gantinya.AUTO_PADDING
sebagai gantinya.SAME
(yaitu mode pad-otomatis), Tensorflow akan mencoba untuk menyebar padding secara merata di kiri dan kanan.VALID
(yaitu tanpa mode padding), Tensorflow akan turun sel kanan dan / atau bawah jika filter dan langkah Anda tidak penuh gambar input penutup.sumber
Saya mengutip jawaban ini dari dokumen resmi tensorflow https://www.tensorflow.org/api_guides/python/nn#Convolution Untuk lapisan 'SAMA', tinggi dan lebar keluaran dihitung sebagai:
dan padding di bagian atas dan kiri dihitung sebagai:
Untuk lapisan 'VALID', tinggi dan lebar keluaran dihitung sebagai:
dan nilai padding selalu nol.
sumber
Ada tiga pilihan padding: valid (tanpa padding), sama (atau setengah), penuh. Anda dapat menemukan penjelasan (dalam Theano) di sini: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
Padding yang valid tidak melibatkan padding nol, sehingga hanya mencakup input yang valid, tidak termasuk nol yang dihasilkan secara buatan. Panjang output adalah ((panjang input) - (k-1)) untuk ukuran kernel k jika langkah s = 1.
Padding yang sama membuat ukuran output sama dengan input ketika s = 1. Jika s = 1, jumlah nol yang diisi adalah (k-1).
Padding penuh berarti bahwa kernel menjalankan seluruh input, sehingga pada akhirnya, kernel dapat memenuhi satu-satunya input dan nol lainnya. Jumlah nol yang diisi adalah 2 (k-1) jika s = 1. Panjang output adalah ((panjang input) + (k-1)) jika s = 1.
Oleh karena itu, jumlah bantalan: (valid) <= (sama) <= (penuh)
sumber
Padding on / off. Tentukan ukuran efektif input Anda.
VALID:
Tidak ada bantalan. Konvolusi dll. Ops hanya dilakukan di lokasi yang "valid", yaitu tidak terlalu dekat dengan batas tensor Anda.Dengan kernel 3x3 dan gambar 10x10, Anda akan melakukan konvolusi pada area 8x8 di dalam batas.
SAME:
Padding disediakan. Setiap kali operasi Anda mereferensikan suatu lingkungan (tidak peduli seberapa besar), nilai nol diberikan ketika lingkungan tersebut melampaui luar tensor asli untuk memungkinkan operasi itu bekerja juga pada nilai batas.Dengan kernel 3x3 dan gambar 10x10, Anda akan melakukan konvolusi pada area 10x10 penuh.
sumber
VALID padding: ini dengan zero padding. Semoga tidak ada kebingungan.
Padding SAMA : Ini agak sulit untuk dipahami di tempat pertama karena kita harus mempertimbangkan dua kondisi secara terpisah sebagaimana disebutkan dalam dokumen resmi .
Mari kita ambil input as , output as , padding as , stride as dan ukuran kernel as (hanya dimensi tunggal yang dipertimbangkan)
Kasus 01 ::
Kasus 02 ::
dihitung sedemikian rupa sehingga nilai minimum yang dapat diambil untuk pengisi. Karena nilai diketahui, nilai dapat ditemukan menggunakan rumus ini .
Mari kita kerjakan contoh ini:
Di sini dimensi x adalah (3,4). Kemudian jika arah horizontal diambil (3):
Jika arah vertikal diambil (4):
Semoga ini bisa membantu untuk memahami bagaimana sebenarnya padding SAMA bekerja di TF.
sumber
Berdasarkan penjelasan di sini dan menindaklanjuti jawaban Tristan, saya biasanya menggunakan fungsi cepat ini untuk pemeriksaan kewarasan.
sumber
Singkatnya, padding 'valid' berarti tidak ada padding. Ukuran output dari lapisan convolutional menyusut tergantung pada ukuran input & ukuran kernel.
Sebaliknya, padding 'sama' berarti menggunakan padding. Ketika langkahnya diatur sebagai 1, ukuran output dari lapisan convolutional dipertahankan sebagai ukuran input dengan menambahkan sejumlah 'batas 0' di sekitar data input saat menghitung konvolusi.
Semoga deskripsi intuitif ini membantu.
sumber
Di sini, W dan H adalah lebar dan tinggi input, F adalah dimensi filter, P adalah ukuran padding (yaitu, jumlah baris atau kolom yang akan diisi)
Untuk padding SAMA:
Untuk bantalan VALID:
sumber
Melengkapi jawaban hebat YvesgereY, saya menemukan visualisasi ini sangat membantu:
Padding ' valid ' adalah gambar pertama. Jendela filter tetap berada di dalam gambar.
Padding ' sama ' adalah angka ketiga. Outputnya berukuran sama.
Ditemukan di artikel ini .
sumber
Tensorflow 2.0 Kompatibel Jawaban : Penjelasan rinci telah diberikan di atas, tentang "Valid" dan "Sama" Padding.
Namun, saya akan menentukan Fungsi Pooling yang berbeda dan Perintah masing-masing
Tensorflow 2.x (>= 2.0)
, untuk kepentingan masyarakat.Fungsi dalam 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Fungsi dalam 2.x :
tf.nn.max_pool
jika digunakan dalam 2.x dantf.compat.v1.nn.max_pool_v2
atautf.compat.v2.nn.max_pool
, jika bermigrasi dari 1.x ke 2.x.tf.keras.layers.MaxPool2D
jika digunakan dalam 2.x dantf.compat.v1.keras.layers.MaxPool2D
atautf.compat.v1.keras.layers.MaxPooling2D
atautf.compat.v2.keras.layers.MaxPool2D
atautf.compat.v2.keras.layers.MaxPooling2D
, jika bermigrasi dari 1.x ke 2.x.Average Pooling => tf.nn.avg_pool2d
atautf.keras.layers.AveragePooling2D
jika digunakan dalam TF 2.x dantf.compat.v1.nn.avg_pool_v2
atautf.compat.v2.nn.avg_pool
atautf.compat.v1.keras.layers.AveragePooling2D
atautf.compat.v1.keras.layers.AvgPool2D
atautf.compat.v2.keras.layers.AveragePooling2D
atautf.compat.v2.keras.layers.AvgPool2D
, jika bermigrasi dari 1.x ke 2.x.Untuk informasi lebih lanjut tentang Migrasi dari Tensorflow 1.x ke 2.x, silakan merujuk ke Panduan Migrasi ini .
sumber