Was ist der Unterschied zwischen ‚SAMT‘ und ‚VALID‘ padding in tf.nn.max_pool
der tensorflow
?
Meiner Meinung nach bedeutet "GÜLTIG", dass es außerhalb der Kanten keine Null-Polsterung gibt, wenn wir den Max-Pool ausführen.
Laut einem Leitfaden zur Faltungsarithmetik für tiefes Lernen heißt es, dass der Poolbetreiber keine Polsterung aufweist, dh verwenden Sie einfach 'VALID' von tensorflow
. Aber was ist die gleiche Polsterung des maximalen Pools tensorflow
?
python
tensorflow
deep-learning
karl_TUM
quelle
quelle
Antworten:
Ich werde ein Beispiel geben, um es klarer zu machen:
x
: Eingabebild der Form [2, 3], 1 Kanalvalid_pad
: Max Pool mit 2x2 Kernel, Schritt 2 und gültiger Polsterung.same_pad
: Max Pool mit 2x2 Kernel, Stride 2 und SAME Padding (dies ist der klassische Weg)Die Ausgabeformen sind:
valid_pad
: hier keine Polsterung, daher ist die Ausgabeform [1, 1]same_pad
: Hier füllen wir das Bild auf die Form [2, 4] (mit-inf
und wenden dann den maximalen Pool an), sodass die Ausgabeform [1, 2] ist.quelle
Wenn Sie ASCII Kunst mögen:
"VALID"
= ohne Polsterung:"SAME"
= mit Nullpolsterung:In diesem Beispiel:
Anmerkungen:
"VALID"
Löscht immer nur die Spalten ganz rechts (oder Zeilen ganz unten)."SAME"
versucht, gleichmäßig nach links und rechts aufzufüllen, aber wenn die Anzahl der hinzuzufügenden Spalten ungerade ist, wird die zusätzliche Spalte nach rechts hinzugefügt, wie dies in diesem Beispiel der Fall ist (dieselbe Logik gilt vertikal: Möglicherweise gibt es eine zusätzliche Zeile von Nullen unten).Bearbeiten :
Über den Namen:
"SAME"
Polsterung, wenn Sie einen Schritt von 1 verwenden, haben die Schicht der Ausgänge die gleichen räumlichen Dimensionen als seine Eingänge."VALID"
Auffüllen gibt es keine "erfundenen" Auffüllungseingaben. Die Ebene verwendet nur gültige Eingabedaten.quelle
-inf
.Wenn
stride
1 ist (typischer bei Faltung als Pooling), können wir uns die folgende Unterscheidung vorstellen:"SAME"
: Ausgabegröße ist gleich als Eingangsgröße. Dies erfordert, dass das Filterfenster außerhalb der Eingabekarte verschoben wird, daher muss aufgefüllt werden."VALID"
: Das Filterfenster bleibt an der gültigen Position innerhalb der Eingabekarte, sodass die Ausgabegröße um kleiner wirdfilter_size - 1
. Es erfolgt keine Polsterung.quelle
SAME
undVALID
kann genauso gutfoo
undbar
Das Beispiel der TensorFlow-Faltung gibt einen Überblick über den Unterschied zwischen
SAME
undVALID
:Für die
SAME
Polsterung werden die Ausgabehöhe und -breite wie folgt berechnet:Und
Für die
VALID
Polsterung werden die Ausgabehöhe und -breite wie folgt berechnet:quelle
Das Auffüllen ist eine Operation zum Erhöhen der Größe der Eingabedaten. Bei eindimensionalen Daten fügen Sie dem Array einfach eine Konstante hinzu, in 2-dim umgeben Sie die Matrix mit diesen Konstanten. In n-dim umgeben Sie Ihren n-dim-Hyperwürfel mit der Konstante. In den meisten Fällen ist diese Konstante Null und wird als Null-Auffüllung bezeichnet.
Hier ist ein Beispiel für eine Nullpolsterung mit
p=1
Anwendung auf einen 2D-Tensor:Sie können eine beliebige Auffüllung für Ihren Kernel verwenden, aber einige der Auffüllwerte werden häufiger verwendet als andere:
k
k
ist diese Polsterung gleichk - 1
.Um eine beliebige Auffüllung in TF zu verwenden, können Sie verwenden
tf.pad()
quelle
Kurze Erklärung
VALID
: Wenden Sie keine Auffüllung an, dh nehmen Sie an, dass alle Dimensionen gültig sind , damit das Eingabebild vollständig von dem von Ihnen angegebenen Filter und Schritt abgedeckt wird.SAME
: Wenden Sie eine Auffüllung auf die Eingabe an (falls erforderlich), damit das Eingabebild vollständig von den von Ihnen angegebenen Filtern und Schritten abgedeckt wird. Für Schritt 1 wird dadurch sichergestellt, dass die Ausgabebildgröße gleich ist als Eingabe.Anmerkungen
NO_PADDING
werden.AUTO_PADDING
werden.SAME
(dh Auto-Pad-Modus) versucht Tensorflow, die Polsterung sowohl links als auch rechts gleichmäßig zu verteilen.VALID
(dh ohne Auffüllmodus) fällt der Tensorflow nach rechts und / oder in die unteren Zellen, wenn Ihr Filter und Schritt das Eingabebild nicht vollständig abdeckt.quelle
Ich zitiere diese Antwort aus den offiziellen Tensorflow-Dokumenten https://www.tensorflow.org/api_guides/python/nn#Convolution. Für die 'SAME'-Auffüllung werden die Ausgabehöhe und -breite wie folgt berechnet:
und die Polsterung oben und links werden wie folgt berechnet:
Für die 'VALID'-Auffüllung werden die Ausgabehöhe und -breite wie folgt berechnet:
und die Füllwerte sind immer Null.
quelle
Es gibt drei Möglichkeiten der Polsterung: gültig (keine Polsterung), gleich (oder halb), voll. Erklärungen (in Theano) finden Sie hier: http://deeplearning.net/software/theano/tutorial/conv_arithmetic.html
Die gültige Auffüllung beinhaltet keine Nullauffüllung, sodass nur die gültige Eingabe abgedeckt wird, ohne künstlich erzeugte Nullen. Die Länge der Ausgabe ist ((die Länge der Eingabe) - (k-1)) für die Kerngröße k, wenn der Schritt s = 1 ist.
Durch die gleiche Auffüllung ist die Größe der Ausgänge mit der der Eingänge identisch, wenn s = 1 ist. Wenn s = 1 ist, ist die Anzahl der aufgefüllten Nullen (k-1).
Das vollständige Auffüllen bedeutet, dass der Kernel über die gesamten Eingaben läuft, sodass der Kernel an den Enden möglicherweise nur die eine Eingabe und sonst die Nullen erfüllt. Die Anzahl der aufgefüllten Nullen beträgt 2 (k-1), wenn s = 1 ist. Die Länge der Ausgabe ist ((die Länge der Eingabe) + (k-1)), wenn s = 1 ist.
Daher ist die Anzahl der Auffüllungen: (gültig) <= (gleich) <= (voll)
quelle
Polsterung ein / aus. Bestimmt die effektive Größe Ihrer Eingabe.
VALID:
Keine Polsterung. Faltungsoperationen usw. werden nur an Orten durchgeführt, die "gültig" sind, dh nicht zu nahe an den Grenzen Ihres Tensors.Mit einem Kernel von 3x3 und einem Bild von 10x10 würden Sie eine Faltung im 8x8-Bereich innerhalb der Grenzen durchführen.
SAME:
Polsterung ist vorhanden. Immer wenn Ihre Operation auf eine Nachbarschaft verweist (egal wie groß), werden Nullwerte bereitgestellt, wenn sich diese Nachbarschaft außerhalb des ursprünglichen Tensors erstreckt, damit diese Operation auch für Grenzwerte funktioniert.Mit einem Kernel von 3x3 und einem Image von 10x10 würden Sie eine Faltung im gesamten 10x10-Bereich durchführen.
quelle
GÜLTIGE Auffüllung: Dies erfolgt mit Null-Auffüllung. Hoffe es gibt keine Verwirrung.
GLEICHE Polsterung: Dies ist in erster Linie schwierig zu verstehen, da wir zwei Bedingungen getrennt betrachten müssen, wie in den offiziellen Dokumenten erwähnt .
Nehmen wir Eingabe als , Ausgabe als , Auffüllen als , Schritt als und Kernelgröße als (nur eine einzige Dimension wird berücksichtigt).
Fall 01: :
Fall 02: :
wird so berechnet, dass der Mindestwert, der zum Auffüllen verwendet werden kann. Da der Wert von bekannt ist, kann der Wert von unter Verwendung dieser Formel gefunden werden .
Lassen Sie uns dieses Beispiel ausarbeiten:
Hier ist die Dimension von x (3,4). Wenn dann die horizontale Richtung genommen wird (3):
Wenn die vertikale Richtung genommen wird (4):
Ich hoffe, dies hilft zu verstehen, wie die gleiche Auffüllung in TF tatsächlich funktioniert.
quelle
Basierend auf der Erklärung hier und der Weiterverfolgung von Tristans Antwort verwende ich diese Schnellfunktionen normalerweise für die Überprüfung der geistigen Gesundheit.
quelle
Zusammenfassend bedeutet "gültige" Polsterung keine Polsterung. Die Ausgabegröße der Faltungsschicht verringert sich abhängig von der Eingabegröße und der Kernelgröße.
Im Gegenteil, "gleiche" Polsterung bedeutet die Verwendung von Polsterung. Wenn der Schritt auf 1 gesetzt ist, bleibt die Ausgabegröße der Faltungsschicht als Eingabegröße erhalten, indem bei der Berechnung der Faltung eine bestimmte Anzahl von '0-Rändern' um die Eingabedaten angehängt wird.
Hoffe diese intuitive Beschreibung hilft.
quelle
Hier sind W und H Breite und Höhe der Eingabe, F sind Filterabmessungen, P ist die Auffüllgröße (dh die Anzahl der aufzufüllenden Zeilen oder Spalten).
Für die gleiche Polsterung:
Für gültige Polsterung:
quelle
Als Ergänzung zu YvesgereYs großartiger Antwort fand ich diese Visualisierung äußerst hilfreich:
Das Auffüllen ' gültig ' ist die erste Zahl. Das Filterfenster bleibt im Bild.
Das Auffüllen von " same " ist die dritte Zahl. Die Ausgabe ist gleich groß.
Fand es auf diesem Artikel .
quelle
Tensorflow 2.0-kompatible Antwort : ausführliche Erläuterungen zu "Valid" und "Same" Padding gegeben.
Ich werde jedoch verschiedene Pooling-Funktionen und ihre jeweiligen Befehle
Tensorflow 2.x (>= 2.0)
zum Nutzen der Community angeben .Funktionen in 1.x :
tf.nn.max_pool
tf.keras.layers.MaxPool2D
Average Pooling => None in tf.nn, tf.keras.layers.AveragePooling2D
Funktionen in 2.x :
tf.nn.max_pool
bei Verwendung in 2.x undtf.compat.v1.nn.max_pool_v2
odertf.compat.v2.nn.max_pool
bei Migration von 1.x auf 2.x.tf.keras.layers.MaxPool2D
wenn in 2.x und verwendettf.compat.v1.keras.layers.MaxPool2D
odertf.compat.v1.keras.layers.MaxPooling2D
odertf.compat.v2.keras.layers.MaxPool2D
odertf.compat.v2.keras.layers.MaxPooling2D
, wenn von 1.x auf 2.x migriert.Average Pooling => tf.nn.avg_pool2d
odertf.keras.layers.AveragePooling2D
wenn in TF 2.x und verwendettf.compat.v1.nn.avg_pool_v2
odertf.compat.v2.nn.avg_pool
odertf.compat.v1.keras.layers.AveragePooling2D
odertf.compat.v1.keras.layers.AvgPool2D
odertf.compat.v2.keras.layers.AveragePooling2D
odertf.compat.v2.keras.layers.AvgPool2D
, wenn von 1.x auf 2.x migriert.Weitere Informationen zur Migration von Tensorflow 1.x nach 2.x finden Sie in diesem Migrationshandbuch .
quelle