Was ist der Unterschied zwischen 'SAME' und 'VALID' padding in tf.nn.max_pool
von tensorflow
?
Meiner Meinung nach bedeutet 'VALID', dass es kein Null-Padding außerhalb der Ränder geben wird, wenn wir max pool machen.
Laut A guide to convolution arithmetic for deep learning heißt es, dass es keine Auffüllungen im pool-Operator gibt, d.h. wir verwenden einfach 'VALID' von tensorflow
.
Aber was ist 'SAME' padding von max pool in tensorflow
?
Wenn Sie Ascii-Kunst mögen:
"VALID"
= ohne Füllung:
Eingaben: 1 2 3 4 5 6 7 8 9 10 11 (12 13)
|________________| entfällt
|_________________|
"SAME"
= mit Null-Polsterung:
pad| |pad
Eingaben: 0 |1 2 3 4 5 6 7 8 9 10 11 12 13|0 0
|________________|
|_________________|
|________________|
In diesem Beispiel:
Anmerkungen:
"VALID"
lässt immer nur die äußersten rechten Spalten (oder die untersten Zeilen) weg."SAME"
versucht, gleichmäßig links und rechts aufzufüllen, aber wenn die Anzahl der hinzuzufügenden Spalten ungerade ist, fügt es die zusätzliche Spalte rechts hinzu, wie es in diesem Beispiel der Fall ist (dieselbe Logik gilt vertikal: es kann eine zusätzliche Reihe von Nullen am unteren Ende geben).Edit:
Zum Namen:
Ich werde ein Beispiel geben, um es klarer zu machen:
x
: Eingabebild der Form [2, 3], 1 KanalDie Ausgabeformen sind:
valid_pad
: hier, kein Padding, also ist die Ausgabeform [1, 1]x = tf.constant([[1., 2., 3.],
[4., 5., 6.]])
x = tf.reshape(x, [1, 2, 3, 1]) # give a shape accepted by tf.nn.max_pool
valid_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='VALID')
same_pad = tf.nn.max_pool(x, [1, 2, 2, 1], [1, 2, 2, 1], padding='SAME')
valid_pad.get_shape() == [1, 1, 1, 1] # valid_pad is [5.]
same_pad.get_shape() == [1, 1, 2, 1] # same_pad is [5., 6.]
Das TensorFlow Convolution Beispiel gibt einen Überblick über den Unterschied zwischen SAME
und VALID
:
Für das SAME
Padding werden die Höhe und Breite der Ausgabe wie folgt berechnet:
out_height = ceil(float(in_height) / float(strides[1]))
out_width = ceil(float(in_width) / float(strides[2]))
Und
Für die `VALID'-Auffüllung werden die Höhe und Breite der Ausgabe wie folgt berechnet:
out_height = ceil(float(in_height - filter_height + 1) / float(strides[1]))
out_width = ceil(float(in_width - filter_width + 1) / float(strides[2]))